【发布时间】:2023-03-22 13:24:01
【问题描述】:
我一直在尝试理解 ECMAScript 5 中引入的新 Object.create 方法。
通常当我想使用继承时,我会这样做:
var Animal = function(name) { this.name = name; }
Animal.prototype.print = function() { console.log(this.name); }
var Dog = function()
{
return Animal.call(this, 'Dog');
}
Dog.prototype = new Animal();
Dog.prototype.bark = function() { console.log('bark'); }
我只是将一个新创建的 Animal 对象分配给 Dog 的原型,一切都像魅力一样工作:
var dog1 = new Dog();
dog1.print(); // prints 'Dog'
dog1.bark(); // prints 'bark'
dog1.name; //prints 'Dog'
但是人们(没有解释)说Dog.prototype = new Animal(); 不是继承的工作方式,我应该使用 Object.create 方法:
Dog.prototype = Object.create(Animal.prototype);
这也有效。
使用Object.create 有什么好处还是我错过了什么?
更新:有人说Dog.prototype = Animal.prototype; 也可以工作。所以现在我完全糊涂了
【问题讨论】:
-
如果我不得不猜测,你会注意到在
Dog.prototype = new Animal();之后扩展 Animal 原型时的区别。Dog不会继承此扩展。但无法在这里测试该理论。 -
@SimonBoudrias 不幸的是,我在这些问题中没有找到任何有用的东西
-
简短回答:运行
Animal构造函数可能会产生不良副作用。 -
通过
Dog.prototype = new Animal();,dog 的原型获得了Animal 实例的所有属性,还有name属性。但是对于Object.create(Animal.prototype);,原型只能获得Animal原型的属性。 -
仅作记录:这是实现类继承的另一种方式,取自 Backbone.js:
var Surrogate = function(){ this.constructor = child; }; Surrogate.prototype = parent.prototype; child.prototype = new Surrogate;
标签: javascript