关于Javascript原型链
首先,我们来定义一个构造函数:
function Bar() { }
这时候它的各种属性如下所示:
Bar.prototype.constructor;//Bar()
Bar.constructor;//Function()
Bar.prototype;//Bar{}
//-------------- 方案一 Begin ------------------
接下来,我们定义另一个构造函数:
function Foo() {this.value = 42;}
改变构造函数Foo的原型对象为一个Object,并且包含了一个方法method,
(注意:这时Foo的原型对象已经不是它本身了,而是Object { method=function()})
Foo.prototype = {
method: function () { alert("foo.method"); }
};
改变构造函数Bar的原型对象为Foo的一个实例:
Bar.prototype = new Foo();
这时候,我们输出Bar的各种属性如下:
Bar.prototype.constructor;//Object()
Bar.constructor;//Function()
Bar.prototype;//Object { value=42, method=function()}
//-------------- 方案一 End ------------------
但是,如果我们不用重新制定Foo的原型对象的方法来给它增加方法的方式,我们这样来做:
Foo.prototype.method = function () { alert("fooo.method"); }
//-------------- 方案二 Begin ------------------
即我们可以将上面的这样写:
function Foo() {this.value = 42;}
Foo.prototype.method = function () { alert("fooo.method"); }
Bar.prototype = new Foo();
这样,Foo的原型对象就不会被改变,仍然是它自己,即:Foo { method=function()},
那么这时构造函数Bar的各种属性输出应该是这样的:
Bar.prototype.constructor;//Foo()
Bar.constructor;//Function()
Bar.prototype;//Foo { value=42, method=function()}
//-------------- 方案二 End ------------------
综上所述,正是因为有以上两种情况的出现,为了维护原型链的正确性,我们需要重新制定构造函数Bar的原型对象的构造器:
Bar.prototype.constructor=Bar;
这时Bar的各种属性是这样的:
Bar.prototype.constructor;//Bar()
Bar.constructor;//Function()
Bar.prototype;//Bar { value=42, constructor=Bar(), method=function()}

浙公网安备 33010602011771号