随笔-69  评论-0  文章-5  trackbacks-0

prototype 是javascript实现继承的基本方法,但这种继承和java等继承有什么本质的区别呢


在 JavaScript 中,对象的 prototype 在运行期是不可见的,只能在定义对象的构造函数时,创建对象之前设定。下面的用法都是错误的:

o2.prototype  =  o1;
/* *
  这时只定义了 o2 的一个名为“prototype”的属性,
  并没有将 o1 设为 o2 的 prototype。
*/
 
//  ---------------
 
f2 
=   function (){};
o2 
=   new  f2;
f2.prototype 
=  o1;
/* *
  这时 o1 并没有成为 o2 的 prototype,
  因为 o2 在 f2 设定 prototype 之前已经被创建。
*/
 
//  ---------------
 
f1 
=   function (){};
f2 
=   function (){};
o1 
=   new  f1;
f2.prototype 
=  o1;
o2 
=   new  f2;
/* *
  同样,这时 o1 并不是 o2 的 prototype,
  因为 JavaScript 不允许构造函数的 prototype 对象被其它变量直接引用。
*/

从上面的例子可以看出:如果你想让构造函数 F2 继承另外一个构造函数 F1 所定义的属性和方法,那么你必须先创建一个 F1 的实例对象,并立刻将其设为 F2 的 prototype。笔者认为这种继承方法不够直观,并且将对象的设计期和运行期混在一起


就是拿类来“继承”另外一个类的实例的说。。。



继续:

function  MyObject1(formalParameter){
    
this .testNumber  =  formalParameter;
}

function  MyObject2(formalParameter){
    
this .testString  =  formalParameter;
}

MyObject2.prototype 
=   new  MyObject1(  8  );

var  objectRef  =   new  MyObject2(  " String_Value "  );

Theinstance of MyObject2 referred to by the objectRef variable has a prototype chain. The first object in that chain is the instance of MyObject1 that was created and assigned to the prototype property of the MyObject2 constructor. The instance of MyObject1 has a prototype, the default Object prototype that corresponds with the object referred to by Object.prototype. Object.prototype has a null prototype(!) so the prototype chain comes to an end at this point.


说明prototype是类的一个属性而不是实例的属性。。。




prototype是一个链,链的尽头是Object.prototype而这个prototype有一些toString()之类的通用方法,且这个prototype的prototype为null


现在了解了怎样通过prototype实现继承了吧:

1,如果给一个实例动态添加属性的话,这个属性只能做用于这个实例
2,如果给一个类的prototype添加属性的话,这个属性会在类的每个实例中产生一个拷贝,即会做用于类的所有实例,产生类似继承的效果
posted on 2006-05-26 14:46 liunix 阅读(250) 评论(0)  编辑  收藏 所属分类: AJAX相关

只有注册用户登录后才能发表评论。


网站导航: