请考虑以下代码段:
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)上述行如何有意义?
答案 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