猿问

使用`Object.create‘进行继承的好处

使用`Object.create‘进行继承的好处

我一直想把我的头转到新的Object.create方法是在ECMAScript 5中介绍的。

通常,当我想使用继承时,我会这样做:

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'); }

我只是给狗的原型分配了一个新创建的动物对象,所有的东西都很有魅力:

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;也能起作用。所以现在我完全糊涂了


ABOUTYOU
浏览 921回答 3
3回答

慕哥9229398

我试着说明一下两者之间的区别:下面是当你写东西的时候会发生的事情new Animal():    //creating a new object     var res = {};     //setting the internal [[prototype]] property to the prototype of Animal     if (typeof Animal.prototype === "object" && Animal.prototype !== null) {         res.__proto__ = Animal.prototype;     }     //calling Animal with the new created object as this     var ret = Animal.apply(res, arguments);     //returning the result of the Animal call if it is an object     if (typeof ret === "object" && ret !== null) {         return ret;     }     //otherise return the new created object     return res;下面是基本的情况Object.create:    //creating a new object     var res = {};     //setting the internal [[prototype]] property to the prototype of Animal     if (typeof Animal.prototype !== "object") {         throw "....";     }     res.__proto__ = Animal.prototype;     //return the new created object     return res;所以它会做同样的事情,但是它不会调用Animal函数,它也总是返回新创建的对象。在您的情况下,您将得到两个不同的对象。第一种方法是:Dog.prototype = {     name: undefined,     __proto__: Animal.prototype};第二种方法是:Dog.prototype = {     __proto__: Animal.prototype};你真的不需要name属性,因为您已经将其分配给Dog实例Animal.call(this, 'Dog');.你的主要目标是让你的Dog实例访问Animal原型,这两种方法都可以实现。但是,第一种方法会做一些在您的情况下并不真正需要的额外的东西,甚至会导致不必要的结果,就像Pumba 80提到的那样。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答