将原型与新产品结合使用有什么好处?

时间:2013-11-08 12:57:02

标签: javascript inheritance prototype

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

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;

3 个答案:

答案 0 :(得分:0)

如果您执行Cat.prototype = Animal.prototype;然后尝试添加到Cat.prototype,则还要添加到Animal.prototype。目前的最佳做法实际上是

Cat.prototype = Object.create(Animal.prototype);

答案 1 :(得分:0)

  1. 这意味着对Cat.prototype的任何更改都会反映到Animal,即出现在超类中的子类mehods!
  2. 构造函数中定义的任何Animal成员在执行new Cat()时都不可用。例如。假设Animal构造函数是:

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

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

答案 2 :(得分:0)

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

通过执行Cat.protoype = Animal.prototype,您没有按照之前提到的那样将原型分配给对方,因此如果您向其中添加某些内容,则会影响另一个。