如何正确设置原型
How to properly set prototype?
我正在一本名为《面向对象 JavaScript》的书中练习。
第5章的练习包含以下4个问题:
- 创建一个名为 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;
解决了我的问题。
在第6章第173页中,该书说
覆盖原型会对构造函数属性产生副作用。因此,最好在继承后重置构造函数
Shape = {
type: 'Shape',
getType: function (){ return this.type;}
}
function Triangle( a, b, c){
this.a = a;
this.b = b;
this.c = c;
this.type = 'Triangle';
}
Triangle.prototype = Shape;
Triangle.prototype.constructor = Triangle;
Triangle.prototype.getPerimeter = function (){
console.log('Get Perimeter');
return this.a + this.b + this.c;
}
var t = new Triangle(1,2,3);
console.log(t.constructor === Triangle);
console.log(Shape.isPrototypeOf(t));
console.log(t.getPerimeter());
console.log(t.getType());
将 Shap 对象分配给 Triangle.prototype,然后用 Triangle 覆盖构造函数将解决问题。
function Shape() {
type = "Shape";
}
Shape.prototype.getType = function() {
return "Mi tipo es " + this.type;
}
function Triangle(a, b, c) {
Shape.call(this)
this.a = a;
this.b = b;
this.c = c;
this.type = "Triangle";
}
Triangle.prototype = Object.create(Shape.prototype);
Triangle.prototype.constructor = Triangle;
Triangle.prototype.getPerimeter = function() {
return this.a + this.b + this.c;
}
var t = new Triangle(1, 2, 3);
console.log(t instanceof Triangle);
console.log(Shape.prototype.isPrototypeOf(t));
t.getPerimeter();
t.getType();
相关文章:
- 用javascript为预定义对象设置原型
- 在Javascript中设置没有__proto__的函数的原型
- 从设置为原型的对象调用属性
- Javascript-从函数内部设置原型
- JS原型无法设置属性'moveRight'的未定义
- Javascript设置&阴影属性(原型链)
- 正在对通过object.create创建的对象设置原型
- JavaScript在一行中设置了命名函数的原型
- 在for循环中设置断点会导致在数组上使用原型时出错
- 在原型.js中设置原型值失败
- 业务催化剂原型核心.ashx 拒绝设置不安全的标头“连接”冲突
- 如何正确设置原型
- 从 JavaScript 动画对象原型设置变量
- 使用原型设置按钮的 onclick 事件
- 我在这个原型设置上做错了什么
- 为什么不't〃;var derived1=新对象(基)“;将derived1.原型设置为基础
- JavaScript继承(将原型设置为内部)失败
- 将函数原型设置为null对新创建的javascript对象没有影响
- 将函数原型设置为新对象
- Javascript OOP -从原型设置器访问方法