全文转载自:http://blog.csdn.net/junkaih2008/article/details/2653142
我们知道
JScript
中对象的
prototype
属性,是用来返回对象类型原型的引用的。我们使用
prototype
属性提供对象的类的一组基本功能。并且对象的新实例会
"
继承
"
赋予该对象原型的操作。但是这个
prototype
到底是怎么实现和被管理的呢?
对于对象的
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>
分享到:
相关推荐
JS 中 prototype 的理解 prototype 是 JavaScript 中的一个重要概念,它是每个构造函数都有的一个属性,即原型。通过 prototype,可以实现继承和扩展对象的功能。prototype 的主要思想是,现在有 1 个类 A,我想要...
在JavaScript中,`prototype`是一个非常重要的概念,它涉及到对象的继承和方法共享。每个函数(在JavaScript中,函数也是一种对象)都有一个`prototype`属性,这个属性指向一个对象,这个对象的用途是为通过该函数...
JavaScript中的`prototype`属性是实现面向对象编程的关键概念之一,尤其在JavaScript中,它用于实现对象的继承。本文将深入探讨`prototype`的含义、作用以及如何使用。 1. **什么是prototype** 在JavaScript中,每...
Prototype.js 是一个强大的JavaScript类库,它为开发者提供了丰富的功能,使得创建具有高度互动性和Web2.0特性的富客户端页面变得更为简单。这个库的设计理念是扩展JavaScript的基础对象,提供一套统一且易于使用的...
### JavaScript中的Prototype用法详解 #### 一、引言 在JavaScript中,`prototype`是一个非常重要的概念,尤其是在面向对象编程(OOP)方面。通过理解并掌握`prototype`的使用,开发者可以更加灵活地扩展对象的功能,...
JavaScript中的`prototype`是语言核心概念之一,它在对象创建、继承和方法共享中起着关键作用。在JavaScript中,每个对象都有一个`prototype`属性,这个属性引用了一个对象,通常用于实现对象间的继承。理解`...
JavaScript中的`prototype`属性是理解面向对象编程的关键概念之一。每个构造函数(即函数)都有一个内置的`prototype`属性,这个属性允许我们为对象创建共享的属性和方法,从而实现代码复用和继承。在JavaScript中,...
《prototype_1.7.3.js:JavaScript框架的里程碑》 在JavaScript的世界里,Prototype库是一个不可或缺的重要组成部分,尤其在Web开发领域,它为开发者提供了强大的功能和便利性。Prototype_1.7.3.js是这个库的一个...
Prototype是JavaScript库,它为浏览器...而源代码文件`prototype-1.6.0.3.js`则让你可以直接在项目中应用或研究Prototype的实现。对于前端开发者而言,掌握Prototype能提升开发效率,同时增强网页的交互性和动态性。
以上示例展示了`prototype`的多样性和实用性,无论是基本功能的添加,已有方法的增强,还是新功能的创造,`prototype`都是JavaScript开发中不可或缺的工具。然而,使用`prototype`也需谨慎,过度使用可能导致代码...
Prototype JavaScript 框架是Web开发中的一个关键工具,它为JavaScript编程提供了许多实用的类库函数和设计模式。这个“Prototype 1.6中文手册 chm+prototype 1.6.js源码 最新版”正是面向希望深入学习和掌握...
它在Web开发中扮演着重要的角色,尤其在AJAX(异步JavaScript和XML)应用中,Prototype.js 提供了丰富的功能和工具,使得开发者能更高效地编写JavaScript代码。 ### 一、Prototype.js核心特性 1. **DOM操作**:...
在实际开发中,Prototype.js可以显著提高开发效率,减少代码量,并且由于其良好的兼容性和丰富的功能,成为了许多开发者喜爱的JavaScript插件。下载并使用"prototype.js"文件,即可开始体验这些强大的功能。不过要...
本文实例讲述了JS中prototype的用法。分享给大家供大家参考。具体分析如下: JS中的phototype是JS中比较难理解的一个部分 本文基于下面几个知识点: 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 ...
本文将深入探讨JavaScript中的类和继承,并结合`prototype.js`文件中的示例进行解析。 ### 类的概念与模拟 在JavaScript中,我们通常使用函数来模拟类的行为。一个函数可以看作是一个类的定义,通过`new`关键字来...
JavaScript Prototype 是一种重要的编程概念,尤其在Web开发中不可或缺。这个压缩包文件“JavaScript_Prototype(源代码+中文手册).rar”包含了关于JavaScript原型的源代码和中文手册,为学习和理解这一主题提供了...
**标题:** prototype.js简介 **描述:** prototype.js 是一个JavaScript库,...然而,随着ES6及后续版本的推出,许多prototype.js的功能已被原生JavaScript支持,因此在现代开发中,使用这些新的语言特性可能更为合适。
Prototype.js 1.6中的AJAX(异步JavaScript和XML)功能大大简化了与服务器的通信。`Ajax.Request`和`Ajax.Updater`是核心组件,前者用于发送请求,后者用于更新页面的一部分。它们都支持多种HTTP方法(GET、POST等...
prototype的JS文件prototype的JS文件prototype的JS文件prototype的JS文件