我正在一本名为Object-Oriented JavaScript的书中练习一项练习。
第5章中的练习包含以下四个问题:
创建一个名为shape的对象,该对象具有type属性和getType()
方法。
定义一个原型为shape的Triangle()
构造函数。用Triangle()
创建的对象应具有三个自己的对象
属性-a,b和c,代表a边的长度
三角形。
在名为getPerimeter()
的原型中添加一个新方法。
使用以下代码测试您的实现:
。
var t = new Triangle(1, 2, 3);
t.constructor === Triangle; // true
shape.isPrototypeOf(t); // true
t.getPerimeter(); // 6
t.getType(); // "triangle"
这是我针对上述问题的解决方案:
var shape = {
type: 'triangle',
getType: function() {
return this.type;
}
};
function Triangle(a, b, c) {
this.a = a;
this.b = b;
this.c = c;
}
Triangle.prototype = shape; // Maybe something goes wrong here
Triangle.prototype.getPerimeter = function() {
return this.a + this.b + this.c;
}
// ======================================================
var t = new Triangle(1, 2, 3);
console.log(t.constructor === Triangle); // false
console.log(shape.isPrototypeOf(t)); // true
console.log(t.getPerimeter()); // 6
console.log(t.getType()); // triangle
为什么
console.log(t.constructor === Triangle);
作为结果输出false
?我试过删除
console.log(t.constructor === Triangle);
,这使t.constructor === Triangle
等于true
,但会导致TypeError: t.getType is not a function
错误。如何使执行结果与本书提供的答案相同?
最佳答案
新增中Triangle.prototype.constructor = Triangle;
后Triangle.prototype = shape;
解决了我的问题。
该书在第173页第6章中说
覆盖原型会对构造函数属性产生副作用。因此,最好在继承后重置构造函数
关于javascript - 如何正确设置原型(prototype)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36080617/