我正在把我的脑袋包裹在引擎盖下的原型链中,但是我在构建一个功能时遇到了一些困难。我想构建一个函数,它将接受一个对象并添加到对象的原型中。我做错了什么?
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"
答案 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的详细说明