重置原型对象的构造函数属性

时间:2013-12-17 21:53:15

标签: javascript inheritance prototype prototypal-inheritance

请考虑以下代码段:

function shape(){
    this.name = "2d shape"
}

function triangle(){
    this.name = "triangle";
    this.ttest = function(){
        alert("in triangle constructor");
    }
}

function equitriangle(){
    this.name = "equitriangle"
}

var s = new shape();
triangle.prototype = s;
equitriangle.prototype = new triangle();

var et = new equitriangle();

alert(et.name); // this alerts equitriangle
et.ttest(); // this alerts in triangle constructor
alert(x.isPrototypeOf(et));// this alerts true
alert(et.constructor); // **but this alerts the shape constructor instead of the equitriangle constructor** 

问题1)为什么我得到形状构造函数?

但是如果我在

之前添加以下行
equitriangle.prototype.constructor = equitriangle;
var et = new equitriangle();
....
.....
.....
alert(et.constructor); // this now alerts the equitriangle constructor which should be the expected output.

我已经读过,当原型对象被覆盖时,就像在这种情况下一样,它会导致意想不到的结果,并且“重置”构造函数是一个好习惯

equitriangle.prototype.constructor = equitriangle;

但上述内容对我没有意义。

问题2)上述行如何有意义?

1 个答案:

答案 0 :(得分:2)

  

为什么我会得到形状构造函数?

请注意et.constructor是原型继承的属性:

et.constructor; // shape
et.hasOwnProperty('constructor'); // false

然后,.constructor继承自equitriangle.prototype

但请注意,equitriangle.prototype.constructor是从triangle.prototype继承的。

但请注意,triangle.prototype.constructor是从shape.prototype继承的。

最后,shape.prototype.hasOwnProperty('constructor')true