原型继承而不创建父对象

时间:2015-03-06 17:50:29

标签: javascript inheritance

所以我正在阅读 Head First Javascript Programming 这本书,这是一本很棒的书,当我偶然发现多重继承的主题时,我学到了很多东西。

这本书告诉我,要实现多重继承,你应该将构造函数的原型设置为父对象的新对象。

举个例子:

    //Parent
    function Dog (name){
       this.name = name; 
    };



   //Child
   function AwesomeDog(name){
      Dog.call(this, name);
   };
   AwesomeDog.prototype = new Dog();
   AwesomeDog.prototype.constructor = AwesomeDog;
   AwesomeDog.prototype.isAwesome = true;

现在我不同意这是最好的方法,你只为它的原型属性调用Dog构造函数,但你也得到了它的name属性,你通常永远不会使用它,因此总是未定义。

为什么不这样做:

 AwesomeDog.prototype = Dog.prototype;

你只对原型感兴趣,为什么不呢?

在我看来这更好,因为有两个原因:

  1. 创建一个新对象的开销被忽略了(微不足道,但它是什么)
  2. 您孩子的原型中没有无用的属性,可能始终未定义。
  3. 现在这本书在各方面都很出色,这让我相信我可能错过了一些至关重要的东西,但我看不清楚是什么。我无法想象任何具有双重属性的用例(子对象中的一个和原型中的未定义版本)都是有用的。

    我的思维方式是否正确,我可以坚持使用我的方法吗?

2 个答案:

答案 0 :(得分:1)

JavaScript中的对象继承也是构造函数继承的基础。 每个函数都有一个可以修改或替换的prototype属性。该prototype属性被自动分配为一个新的通用对象,它继承自Object.prototype并具有一个名为constructor的自有属性。实际上,JavaScript引擎会为您执行以下操作:

// you write this
function YourConstructor() {
    // initialization
}

// JavaScript engine does this for you behind the scenes
YourConstructor.prototype = Object.create(Object.prototype, {
    constructor: {
        configurable: true,
        enumerable: true,
        value: YourConstructor
        writable: true
    }
});

所以没有做任何额外的事情,这段代码设置了构造函数 将属性设置为继承自Object.prototype的对象, 这意味着YourConstructor的任何实例也都从Object继承 。原型。 YourConstructor是Object的子类型,Object是超类型 YourConstructor

答案 1 :(得分:0)

  

现在我不同意这是最好的方法,你叫狗   构造函数仅用于其prototype属性,但您也获得了名称   有它的财产,你通常永远不会使用,因此   总是未定义。

你完全正确。使用new存在这些问题,因此不鼓励。

  

为什么不这样做:

AwesomeDog.prototype = Dog.prototype;

这有一个问题:AwesomeDogDog个实例共享相同的原型。因此,它们将继承相同的属性和方法,因此子类化没有意义。 constructor应该是AwesomeDog还是Dog

相反,正确的方法是将AwesomeDog.prototype分配给继承自Dog.prototype但未调用Dog的对象。您可以使用Object.create

执行此操作
AwesomeDog.prototype = Object.create(Dog.prototype);
AwesomeDog.prototype.constructor = AwesomeDog;