代码改变世界

javascript 原型 引用

2009-03-06 10:53  wlstyle  阅读(313)  评论(0)    收藏  举报
 1 function Car(door){
 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的引用。