【问题标题】:Prototype Chain Inheritance原型链继承
【发布时间】:2017-03-26 05:25:11
【问题描述】:

我正在深入了解原型链,但我在构建函数时遇到了一些困难。我想构建一个函数来接收一个对象并添加到对象的原型中。我做错了什么?

function getObject(obj) {
  function F() {}
  F.prototype.say = function(){
    console.log("Hello", this.name);
  }.bind(obj);

  obj.prototype = Object.create(F.prototype);
  return obj;
}

var r = getObject({ name: "James"});

r.name
r.say()

// r = { name: "James" } 
// r.say() "Hello James"

我得到了我想要的东西。我受到限制,不允许使用 ES6 类...我知道对吗?

function getObject(obj) {
  function F() { }
  F.prototype.say = function(){
    console.log("Hello", this.name);
  };
  const output = Object.create(F.prototype);
  return Object.assign(output, obj);
}

var r = getObject({ name: "James"});
r // { name: "James" }
r.name  // "James"
r.say() // "Hello James"

【问题讨论】:

  • 对象没有原型属性,函数没有。他们只有一个 dunder 原型链接

标签: javascript inheritance prototype


【解决方案1】:

我已经修改了代码。对象没有原型。函数具有可用于链接的原型。希望这会有所帮助。

function getObject(obj) {
    function F() {}
    F.prototype = Object.create(obj);

    F.prototype.say = function(){
        console.log("Hello", this.name);
    }.bind(obj);

    return new F();
}

var r = getObject({ name: "James"});

console.log(r.name); // James
r.say() // Hello James

【讨论】:

  • 谢谢,正是我要找的东西
【解决方案2】:

您可以向 obj.something = function() {}; 等对象添加方法

对于方法链,您希望在继承的函数中返回 this

所以这样的事情会回答你的问题

function getObject(obj) {
    obj.say = function() {
        console.log(`Hello ${this.name}`);
        return this;
    }
    obj.hi = function() {
        console.log('hi');
        return this;
    }
    return obj;
}

var newObj = getObject({});

newObj.say().hi();
// Helo A K
// hi

您还分配 obj.prototypes 等于一个类,而不是类原型。所以将来如果你想让一个原型等同于一个类原型,请使用obj.prototype = Object.create(anothingObj.prototype);

【讨论】:

  • new f() 不是一个类。它可能看起来像一个类行为,但 new 关键字只是创建一个空对象。JS 没有类
  • 它不是一个类,而是模拟一个类。 new 关键字没有创建空对象。 new F(); 实际上包含函数 say。顺便说一句,JavaScript ES6 有类。
  • new 关键字正在创建一个空对象,您可以检查 ECMAScript 规范,函数 F() 只是将 this 指向新的空对象。是的,ES6 可能有 class 关键字,但这并不意味着 JS 有类。它只是语法糖。这与 new F() 的行为相同,只是代码少了很多。
  • @4mohit 谢谢你否决了我对这个家伙问题的正确答案,但你没有回答关于如何进行方法链接的 A K 问题。所以请善待研究,然后投票给我的答案。谢谢。
  • 我不想为我的对象添加属性。我希望给它一个指向新方法的原型。
【解决方案3】:

您在对象上显式添加原型属性。obj.prototype = undefined 当您使用 new 关键字调用它时,它只会向该属性添加一个空对象。所以新的 obj 将是 obj = {name:'james' , prototype: {}}。现在对象的原型属性将指向函数 F 的原型。执行此操作的正确方法是通过 Object.create。你可以像这样模仿同样的行为

 if(!Object.create){ 
 Object.create = function(o) { 
 function F() {} 
 F.prototype = o ;
  return new F(); 
 }; 
}

关于 Object.create polyfill 的详细解释可以查看 MDN Docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2010-09-28
    相关资源
    最近更新 更多