原型链继承

时间:2017-03-26 05:25:12

标签: javascript inheritance prototype

我正在把我的脑袋包裹在引擎盖下的原型链中,但是我在构建一个功能时遇到了一些困难。我想构建一个函数,它将接受一个对象并添加到对象的原型中。我做错了什么?

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"

3 个答案:

答案 0 :(得分: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指定为等于Class,而不是类原型。所以将来如果你想让一个原型等于一个类原型使用obj.prototype = Object.create(anothingObj.prototype);

答案 1 :(得分:2)

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

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 :(得分:1)

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

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

您可以查看MDN Docs以获取Object.create polyfill的详细说明