为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2019-05-31 10:54:05
使用`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;也能起作用。所以现在我完全糊涂了
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

我试着说明一下两者之间的区别:

下面是当你写东西的时候会发生的事情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提到的那样。


查看完整回答
反对 回复 2019-05-31
  • 3 回答
  • 0 关注
  • 920 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信