0

从一本书中我得到了这个继承的例子:

var Animal = function(){};
Animal.prototype.sleep = function(){
    // ...
};

var Cat = function(){};
// Cat is an animal
Cat.prototype = new Animal;
Cat.prototype.meow = function(){
    // ...
};

var scratchy = new Cat();
scratchy.sleep();
scratchy.meow();

但这也有效,对我来说似乎更直观。你为什么不做呢?还是你?它是否创建引用而不是复制原型属性?

Cat.prototype = Animal.prototype;
4

3 回答 3

0

如果您这样做Cat.prototype = Animal.prototype;然后尝试添加到Cat.prototype,那么您也在添加到Animal.prototype。当前的最佳实践实际上是

Cat.prototype = Object.create(Animal.prototype);
于 2013-11-08T13:01:33.077 回答
0
  1. 这意味着对 的任何更改Cat.prototype都将反映到Animal,即出现在超类中的子类方法!
  2. 构造函数中定义的任何Animal成员,在执行new Cat(). 例如,假设Animal构造函数是:

    function Animal(birthDate) {
        this.birthDate = birthDate;
    }
    

    Cat一种方法将包含birthDate属性,第二种方法Cat不会。

于 2013-11-08T13:03:45.190 回答
0

在前面的代码中,Cat.prototype = new Animal您调用 Animal 构造函数var Animal = function() {};,它将创建一个新对象,运行该构造函数和其中的任何代码,分配this给新对象,原型属性附加到构造函数,并返回新对象。使用new看起来很熟悉如何通过经典继承创建“类”,但Javascript使用PROTOTYPAL Inheritence来创建从其他对象继承的新对象。

通过这样做Cat.protoype = Animal.prototype,您并没有做前面提到的事情,您是在将原型分配给彼此,因此如果您向其中一个添加一些东西,它将影响另一个。

于 2013-11-12T00:49:59.787 回答