JScript中的prototype(原型)属性研究(2)

简介:
     上次的文章中我罗列了一下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" > </ script >
< script  language ="javascript" > </ script >
</ body >
</ html >


    The End.


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
6月前
|
JavaScript 前端开发
在JavaScript中,函数原型(Function Prototype)是一个特殊的对象
【5月更文挑战第11天】JavaScript中的函数原型是一个特殊对象,它为所有函数实例提供共享的方法和属性。每个函数在创建时都有一个`prototype`属性,指向原型对象。利用原型,我们可以向所有实例添加方法和属性,实现继承。例如,我们定义一个`Person`函数,向其原型添加`greet`方法,然后创建实例`john`和`jane`,它们都能调用这个方法。尽管可以直接在原型上添加方法,但推荐在构造函数内部定义以封装数据和逻辑。
57 2
|
6月前
|
JavaScript 前端开发 开发者
【专栏】JavaScript 中的 prototype 和__proto__是关乎对象继承和属性查找的关键概念
【4月更文挑战第29天】JavaScript 中的 prototype 和__proto__是关乎对象继承和属性查找的关键概念。prototype 是函数属性,用于实现对象继承,方法和属性定义在其上可被所有实例共享。__proto__是对象属性,实现属性查找机制,当对象自身找不到属性时,会沿原型链向上查找。两者关系:__proto__指向构造函数的 prototype,构成对象与原型的桥梁。虽然 prototype 可直接访问,但__proto__由引擎内部维护,不可见。理解两者区别有助于深入学习 JavaScript。
94 1
|
6月前
|
JavaScript 前端开发
深入理解 JavaScript 对象原型,解密原型链之谜(下)
深入理解 JavaScript 对象原型,解密原型链之谜(下)
|
6月前
|
JavaScript 前端开发
深入理解 JavaScript 对象原型,解密原型链之谜(上)
深入理解 JavaScript 对象原型,解密原型链之谜(上)
|
6月前
|
JavaScript 前端开发 Java
JavaScript难点:原型、原型链、继承、new、prototype和constructor
JavaScript 不像 Java、C++ 这种纯面向对象的语言,可以通过类实现继承,JavaScript中的继承是通过原型实现的,即使 ES6 中新增的 class 类也只是原型的语法糖而已
80 4
|
JavaScript 前端开发 Java
JavaScript 高级2 :构造函数和原型
JavaScript 高级2 :构造函数和原型
79 0
|
JavaScript 前端开发
JavaScript 中的原型、对象原型、原型继承和原型链
在 JavaScript 中,原型(prototype)是一个对象,它用于实现对象之间的继承和共享属性。JavaScript 是一种基于原型的编程语言,每个对象都有一个原型,而原型又可以拥有自己的原型,形成一个原型链。
|
自然语言处理 JavaScript 前端开发
JavaScript:深入理解原型语言,洞察__proto__与prototype之间的区别
JavaScript:深入理解原型语言,洞察__proto__与prototype之间的区别
368 0
|
Web App开发 JavaScript 前端开发
原型(prototype) 和 原型链(__proto__) —— 别再为 JavaScript 的原型苦恼了
原型(prototype) 和 原型链(__proto__) —— 别再为 JavaScript 的原型苦恼了
104 0
|
JavaScript 前端开发
JavaScript prototype(原型)
JavaScript prototype(原型)
89 0
JavaScript prototype(原型)