从一本书中我得到了这个继承的例子:
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;
答案 0 :(得分:0)
如果您执行Cat.prototype = Animal.prototype;
然后尝试添加到Cat.prototype
,则还要添加到Animal.prototype
。目前的最佳做法实际上是
Cat.prototype = Object.create(Animal.prototype);
答案 1 :(得分:0)
Cat.prototype
的任何更改都会反映到Animal
,即出现在超类中的子类mehods!构造函数中定义的任何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
,您没有按照之前提到的那样将原型分配给对方,因此如果您向其中添加某些内容,则会影响另一个。