我正在一本名为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/

10-12 06:24