javascript 原型 引用
2009-03-06 10:53 wlstyle 阅读(313) 评论(0) 收藏 举报2 this.door=door;
3 }
4 Car.prototype={
5 sayDoor:function(){
6 return this.door;
7 }
8 }
9 var car1=new Car(6);
//car1.__proto__=null;
10 Car.prototype={11 sayDoor:function(){
12 return 'only one door';
13 }
14 }
15 var car2=new Car(9);
16 console.log(car1.sayDoor());//output 6
17 console.log(car2.sayDoor())//output onlu one door
在Car的构造函数中指定原型对象为 第四行所示。随即用new操作符创建了car1对象。然后重写Car的原型。如第10行所示。然后创建对象car2.分别调用car1和car2的sayDoor方法。结果发现 输出的值是不一样的。不是通过原型链子对象可以使用父对象的方法吗?(第一想法)如果按照这种理解那么应该output的值都为only one door.但是实际上却不是 。那回顾这个car1通过new操作符是这么创建的。可能也许会解决这个问题。多方查阅资料:得到创建过程是这样的。以car1为例。1.创建一个内置对象将car1初始化。2.如果构造函数的prototype是一个对象那么将car1内部的prototype的赋值为该对象(保存一个对当前对象的引用)。如果构造函数的prototype不是一个对象那么将car1内部的prototype的属性赋值为Object.prototype。3.通过一系列内部方法返回该对象(内涵很丰富!)。
出现理解问题是第二步骤,这里子对象的内部prototype保存 了一个对当前的构造函数的引用。即使后来重写的构造函数的prototype。但是对于car1内部的prototype依然是一个对原先的构造函数的引用。由于这个引用的存在 js引擎的垃圾处理程序不会销毁这个变量。若强型销毁该对象(限于firefox)设置__proto__属性值为null时。会提示找不到该方法(sayDoor)。
总结:1.构造函数创建的对象内部的prototype也就是原型链不是构造函数的prototype属性。
2. 构造函数创建的对象内部的prototype是一个对当前环境中的构造函数prototype的引用。
浙公网安备 33010602011771号