- 浏览: 543156 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (339)
- JavaBase (27)
- J2EE (70)
- Database (22)
- Spring (3)
- struts1.x (6)
- struts2.x (16)
- Hibernate (10)
- IBatis (4)
- DWR (1)
- SSH (5)
- Oracle (31)
- HTML (12)
- javascript (11)
- Thinking (3)
- Workflow (5)
- Live (13)
- Linux (23)
- ExtJS (35)
- flex (10)
- php (3)
- Ant (10)
- ps (1)
- work (2)
- Test (1)
- Regular Expressions (2)
- HTTPServer (2)
- 方言 (1)
- 生活 (2)
- Sybase PowerDesigner (0)
最新评论
-
mikey_5:
非常感谢楼主的分享,<parameter propert ...
Check the output parameters (register output parameters failed) IN Ibatis -
影子_890314:
我现在也有这个错误,求解!
Check the output parameters (register output parameters failed) IN Ibatis -
358135071:
学习了,感谢分享!
使用hibernate 代替 mysql 中 limit 進行分頁 -
wjpiao:
你下面的“正确的映射”里面不是还是有number类型吗?
Check the output parameters (register output parameters failed) IN Ibatis -
zh_s_z:
很有用!弄一份吧!
Oracle数据库分区表操作方法
搜了两
个认为好的讲解
Prototype
属性的文章
,
希望会对大伙有一点帮助
.
我们知道
JScript
中对象的
prototype
属性
,
是用来
返回对象类型原型的引用
的。我们使用
prototype
属性提供对象的类的一组基本功能。并且对象的新实例会
"
继承
"
赋予该对象原型的操作。但是这个
prototype
到底是怎么实现和被管理的呢?
本文着重
解析
javascript
类继承机制,让你从底层了解
javascript
是怎样实现
“
继承
”
这一概念的。
转载自
jimichan
目前
javascript
的实现继承方式并不是通
过
“extend”
关键字来实现的,而是通过
constructor
function
和
prototype
属性来实现继承。首先我们创建一个
animal
类
js
代码
js
代码
等同这样的方式来产生
js
对象。
js
代码
对于对象的
prototype
属
性的说明,
JScript
手册
上如是说:所有
JScript
内部
对象都有只读的
prototype
属
性。
可以向其原型中动态添加功能
(
属性和方法
)
,但该对象不能被赋予不同的原型。
然
而,用户定义的对象可以被赋给新的原型。
下面我们看三个经典的
prototype
属
性的使用示例。
1
、为脚本环境内建对象添加方法:
程序代码
Array
.prototype.max = function()
{
var i, max =
this
[0];
for (i = 1; i < this.length; i++)
{
if (max < this[i])
max = this[i];
}
return max;
};
2
、为用户自定义类
添加方法
:
程序代码
function TestObject(name)
{
this.m_Name = name;
}
TestObject.prototype.ShowName =
function()
{
alert(this.m_Name);
};
3
、更新自定义类的
prototype
:
程序代码
function TestObjectA()
{
this.MethodA = function()
{
alert('
TestObjectA.MethodA()
'); //
显示这一段文字而已
}
}
function TestObjectB()
{
this.MethodB = function()
{
alert('TestObjectB.MethodB()');
}
}
TestObjectB.prototype = new
TestObjectA();
第三个很眼熟吧?对啊,它就是我们前面介绍的原型继承法呀
~~
不过今天我们不是研究
"
继承
"
,之所以可以这样来实现一种继承,只是利用了
prototype
属性的一个副作用而已。
prototype
还
有一个默认的属性:
constructor
,
是用来表示创建对象的函数的
(
即我
们
OOP
里说
的构造函数
)
。
constructor
属性是所有具有
prototype
属性的对象的成员。它们包括除
Global
和
Math
对象以外的所有
JScript
内部对象。
constructor
属性保存了对构造特定对象实例的函数的引用。
弄清楚了
JScript
中
prototype
属性怎么使用后,下面我们再来深入的研究它。
上面的文章中我罗列了一下
prototype
属
性在
JScript
中的
各种用法,但是
prototype
这个
东西却不是
JScript
创造
出来的,
JScript
实际
上是使用了我们设计模式中
prototype pattern
的
一种衍生形式。下面我先简单的说一下
prototype pattern
,
然后再来看到底
JScript
中的
prototype
是怎么回事
?!
What's prototype pattern?
Specify the kinds of objects
to create using a prototypical instance, and create new objects by
copying this prototype.
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,
工作原理是
:通过将一个原型对象传给那个
要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
继续了解到底什么是
prototype
pattern
,可以参看
'
设
计模式之
Prototype(
原型
)'
这篇文章,即使不懂
Java
也没有关系,把它的代码都当
C#
看就行了。
搞清楚什么是原型了吧?反正记着一点,
prototype pattern
是的实现是依赖于
clone
这个操作的,当然要
shallow copy
还是
deep copy
的
clone
看自己的需要了。
下面我们继续说
JScript
里
的
prototype
,为
什么我们说它和
prototype pattern
里的
prototype
不一样呢
?!
这个不是我说就说出来的,也不是我吹出来的,看看这个示例,你就能大概糊
涂:
程序代码
<script language="javascript">
function RP()
{
RP.PropertyA = 1;
//
相当于静态
RP.MethodA = function()
//
相当于静态
{
alert("RP.MethodA ");
};
this.PropertyA = 100;
this.MethodA = function()
{
alert("this.MethodA");
};
}
RP.prototype.PropertyA = 10;
RP.prototype.MethodA = function()
{
alert("RP.prototype.MethodA");
};
</script>
不要着急,还没有开始做示例,只是给出了我们用来演示的一个类。
RP
是什么?
rpwt
吗?当然不是了,
RP
是
ResearchPrototype
了。
好了不废话了,看示例及结果分析。
程序代码
<script language="javascript">
rp = new RP();
alert(RP.PropertyA);
RP.MethodA();
alert(rp.PropertyA);
rp.MethodA();
</script>
运行结果闪亮登场:
1
RP.MethodA
100
this.MethodA
这个
%$@#^$%&^...
,
不要着急,继续看哦!
程序代码
<script language="javascript">
rp = new RP();
delete
RP.PropertyA;
//
竟然还有删除属性
alert(RP.PropertyA);
delete RP.MethodA;
RP.MethodA();
delete rp.PropertyA;
alert(rp.PropertyA);
delete rp.MethodA;
rp.MethodA();
</script>
运行结果再次登场:
程序代码
undefined
A Runtime Error has occurred.
Do you wish to Debug?
Line: 32
Error: Object doesn't support this property or method
10
RP.prototype.MethodA
好玩吧,看出来什么名堂了吗?
这里的
RP.PropertyA
和
RP.MethodA
只是用来做参照的,可是怎么把
this.PropertyA
和
this.MethodA
都
delete
了,还能出来结果
,而且还是
prototype
导入的属性和方法呢?
这就是
JScript
的
prototype
和
prototype pattern
中
prototype
最大的不同了,
JScript
中的这个所谓的
prototype
属性其实是个语言本身支持的特性,这里没有发生任何的
copy
,不管
shallow
还是
deep
的。
对于
JScript
的解释引擎,它在处理
"."
或
"[keyName]"
引用的对象的属性和方法时,先在对象本身的实例
(this)
中查找,如果找到就返回或执行。如果没有查找到,就查找对象的
prototype(this.constructor.prototype)
里是否定义了被查找的对象和
方法,如果找到就返回或执行,如果没有查找到,就返回
undefined(
对于属性
)
或
runtime error(
对于方法
)
。
正因为
prototype
导
入类实例的属性或方法是动态查找的,所以我们才能对系统内部对象添加
prototype
属
性和方法,比如
给
String
对象添加
trim
方法:
程序代码
<script lanuage="javascript">
String.prototype.trim()
{
return this.replace(/(^"s+)|("s+$)/g, "");
}
</scritp>
显然
JScript
中
的这种用法也是
prototype pattern
中的
prototype
不能解释和支持的。
这下对于
JScript OOP
中
原型继承法的理解因该没有任何的障碍了吧?同时也应该明白为什么原型继承法有那么大的天生缺陷了吧?当然如果有任何问题,欢迎继续讨论。
附演示示例源代码:
程序代码
<html>
<head>
<meta name="author" content="birdshome@
博客园
">
<title>JScript Prototype Research</title>
</head>
<body>
<script language="javascript">
function RP()
{
RP.PropertyA = 1;
RP.MethodA = function()
{
alert("RP.MethodA ");
};
this.PropertyA = 100;
this.MethodA = function()
{
alert("this.MethodA");
};
}
RP.prototype.PropertyA = 10;
RP.prototype.MethodA = function()
{
alert("RP.prototype.MethodA");
};
</script>
<script language="javascript">
rp = new RP();
delete RP.PropertyA;
alert(RP.PropertyA);
delete RP.MethodA;
RP.MethodA();
delete rp.PropertyA;
alert(rp.PropertyA);
delete rp.MethodA;
rp.MethodA();
</script>
</body>
</html>
构造函数与其他普通函数区别在于,
1.
构造函数里有
this
关键字,
2.
调用构造函数是使用的
new
关键字。通过
new
运算符调用构造函数
animal
后,系统就会返回一个对
象,这个对象就相当于
到这里我们知道如何在
js
中定义一个类了,接下来我们展示如何写
一个
cat
到这里,
cat
就继承了
animal
对象,类
cat
的一个实例对象
c1
拥有属性
name,age,height,
和方法
play
了。
那么
prototype
起到了一个什么样的作用呢?
prototype
就
好比一个指针,它指向一个
object
,这个
object
就称为子类对象的原型。当
cat
的对象被创建的时候,由于
cat
的构造函数拥有
prototype
属性,那么
cat
的实例就会间接指向这个原型对象了(说成间接的是因为每个
object
都有一个
constructor
属性指向它的构造函数)。
那么问题来了,
“
当我们修改对象
c1
的
name
属性的时候,会不会修改它
prototype
的
name
属性值呢?
”
,答案是否定的。
接下来详细解析:
1.
访问
name
属性:
首先当我们第一次访问
c1.name
的属性的时候,我们会得到值
“pipi”
,这个和我们预料中的一样。但是计算过程你未必
知道。
它计算的过程是这样
的:第一步:检查
c1
对象中是否有
name
属性
,
找
到的话就返回值,没有就跳到第二步,显然没有找到,因为
cat
的构造函数中没有定义。第二步:当第一步没有找时,去间接访问
prototype
对象所指向的
object
,如果在
prototype
对象中找到的
name
属性的话,就返回找到的属性值。如果还是没有找到
的话,再去递归地寻找
prototype
对象的
prototype
对象(去找它的爷爷),一直到找到
name
属性或者没有
prototype
对象为止。如果到最后还是没有找到
name
属性的话就返回
undefined
。
2.
设定
name
属性:当我们设定
c1
对象的
name
属性时,及调用
c1.name= ' new
name';
这个
过程就简单多了。首先检查是否对象已有该属性,若已存在则修改当前值,若不存在则为该对象新增一个属性并设定当前值。值得一提的是,在设定值的过程中没有
去访问
prototype
属性。
为了加深理解,我们再
看一个
read-write-read
的过程,第一次
read
的时候,由于自己的对象没有
name
属性,那么就会返回的原型对象的
name
属性的值。第二步,写入
name
的值,同样没发现本身对象有
name
属性
,
那么就在本身对象上新建一个
name
属性,然后赋值。第三步,再次读取
name
属性,由于在第二步中已经新建了
name
属性,此时就返回在第二步中设定的值。值得一提的
是,在这三步中没有改变原型对象的值。
好了,到此详细分析了
javascript
对象是如果实现继承的,其实和其他的面向对象语
言不一样的是,
javascript
的继承机制是对象的原型继承而不是类型继承。
呵呵,欢迎看完,有不
对的地方欢迎大家讨论!
发表评论
-
纵向Tab ---ext
2010-09-28 16:02 1250net address: http://carina. ... -
js code compress
2010-06-11 01:22 1003文章转自: http://www.rainway.org/20 ... -
Ext.data.Store
2010-04-16 21:26 1458原文: http://www.9iext.cn/thr ... -
ExtJs 确认密码验证的两种实现
2010-03-17 16:36 5028实现1: ************************* ... -
extjs换肤
2010-02-26 14:15 1241extjs换肤 http://www.javachen ... -
ext 教程
2010-01-29 17:05 1007关于Ext 扩展比较好的文章: http:// ... -
demo
2010-01-26 20:11 1216一、下载extjs 1、从http://www.extj ... -
你的水平 字段没超出所以没 滚动条!
2009-12-16 21:36 1099你的水平 字段没超出所以没 滚动条! 你试下吧 colu ... -
在EXT中使用FCKEditor编辑器例子
2009-12-15 16:47 1247... -
js oo
2009-12-15 10:22 858var RectAngle = function(width, ... -
costom extend
2009-12-15 09:06 939//自定義繼承 ---------------------- ... -
Ext extend
2009-12-14 23:56 1320第一章 必须理解Ext.extend ... -
想起温习一下JS中的this apply call arguments
2009-12-14 21:03 1188很多时候讲到语言入门,大家会认为就是要了 ... -
阅读 Ext 学习Javascript(一)Core/Ext.js
2009-12-14 20:46 965从Library的角度 ... -
阅读Ext学习Js(二)---extend从继承说起
2009-12-14 20:45 1088一般的,如果我们定义一个类,会定义一个function对象,然 ... -
Extjs 研究: js基础
2009-12-14 20:33 10801.我们写的变量 ,函 ... -
ExtJS 入门之一 类与继承
2009-12-14 20:08 810在项目中使用ExtJS已经 ... -
Ext表單中一行多列的布局
2009-12-07 08:01 3839var simpleForm = new Ext.Form ... -
extend Ext component demo
2009-12-06 14:01 887extjs的Ext.extend的使用样例(Ext继承) ... -
使用Ext.extend的几点小结
2009-12-06 13:51 14371. TestExtend3 = Ext.extend(Ex ...
相关推荐
JavaScript中的`prototype`属性是实现面向对象编程的关键概念之一,尤其在JavaScript中,它用于实现对象的继承。本文将深入探讨`prototype`的含义、作用以及如何使用。 1. **什么是prototype** 在JavaScript中,每...
JavaScript中的`prototype`属性是理解面向对象编程的关键概念之一。每个构造函数(即函数)都有一个内置的`prototype`属性,这个属性允许我们为对象创建共享的属性和方法,从而实现代码复用和继承。在JavaScript中,...
在JavaScript中,`prototype`是一个核心概念,它关乎对象继承和函数实例化。这篇"prototype学习笔记"可能探讨了如何利用原型链实现面向对象编程的关键技术。以下是对这个主题的详细解析。 首先,理解`prototype`的...
在JavaScript中,`prototype`是一个核心概念,它涉及到对象的继承和原型链。本文将深入探讨`prototype`的含义、作用以及如何使用。 首先,`prototype`是JavaScript中每个函数(对象构造器)的一个属性,它实际上是...
标题“简单理解js的prototype属性及使用”和描述“主要介绍了简单理解js的prototype属性及使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧”提示了本文的主旨在于解析JavaScript...
JavaScript中的Prototype是一个核心概念,它是实现面向对象编程的关键机制。不同于基于类的语言,JavaScript采用原型链(Prototype Chain)实现对象的继承。理解Prototype是深入学习JavaScript的重要步骤。 首先,...
在JavaScript中,Prototype和继承是两个非常核心的概念,它们构成了JavaScript面向对象编程的基础。 Prototype是JavaScript实现继承的主要机制,而继承则是对象之间共享属性和方法的方式。本文将深入探讨这两个概念...
<script type="text/javascript" src="prototype.js"> <script type="text/javascript" src="jquery.js"> ``` 方法二:重命名jQuery变量 我们可以通过重命名 jQuery 变量来避免变量名冲突。例如,我们可以将 `$` ...
Litebox是一款基于JavaScript的无刷新图片放大显示插件,它主要设计用于网页中,提供了一种优雅的方式来展示图片,使得用户在不离开当前页面的情况下,能够查看大图,提升了用户体验。这款插件采用Prototype ...
在JavaScript编程语言中,处理字符串是一项常见的任务,尤其是在数据清洗、格式化以及用户输入验证等场景下。原生的JavaScript自ECMAScript5标准引入后,就已经提供了`String.trim()`方法来去除字符串首尾的空白字符...
总结来说,`tooltips js脚本代码`是一个用于创建动态Tooltips效果的JavaScript库,它结合`prototype.js`库和`tooltip.html`示例文件,帮助开发者快速、简便地在网页中添加Tooltips功能。通过理解和应用这些文件,...
总结来说,JavaScript中的prototype属性有其特定的应用和含义: - 在函数对象上,prototype属性用于定义构造函数创建的所有实例共享的属性和方法。 - 在普通对象上,没有prototype属性,但是可以通过__proto__属性...
Prototype中的美元符号`$`是一个非常常用的快捷方法,它在不同的上下文中有不同的含义。下面我们将详细探讨Prototype框架中`$`、`$$`、`$A`、`$F`、`$H`以及`$R`这些函数的用法。 1. **`$()`**:在Prototype中,`$...
分析如何从字符串中选择单个字符、如何将字符码转换为字符串以及如何复制字符串的部分内容·讲述如何对数组执行连接、复制、排序和倒序操作·说明如何使用jQuery、Prototype和MooTools等JavaScript框架快捷高效地...
此外,`this`关键字在JavaScript中具有特殊含义,它的值取决于函数调用的位置,而不是定义的位置。在面向对象编程中,`this`通常指向调用当前函数的对象。但需要注意,当函数作为普通函数调用时,`this`将指向全局...
javascript中的this,constructor ,prototype,都是老生常谈的问题,深入理解他们的含义至关重要。在这里,我们再来复习一下吧,温故而知新! this this表示当前对象,如果在全局作用范围内使用this,则指代当前页面...
保留字是JavaScript语言中预定义的、具有特定含义的词汇,不能用作变量名、函数名等。在题目中,`class` 在ES6后成为了关键字,但不是JavaScript的原始保留字。因此,选项B `parent` 不属于JavaScript的保留字。其他...
* 原型(prototype)是 JavaScript 中的一种机制,用于实现继承。 * 继承(inheritance)是指一个对象可以继承另一个对象的属性和方法。 八、异步编程 * 异步编程(asynchronous programming)是指在执行某些操作...
面向对象编程(OOP)是软件开发中的一个重要概念,JavaScript通过原型链(prototype chain)提供了实现OOP的机制。本部分讨论了this关键字的含义、prototype对象以及如何使用Object对象实现继承等高级特性。 #### ...