在 javascript 中,我有一个对象文字:
var objA = {
doStuff: function() {
// do objA stuff
}
}
我扩展 objA,并重写 doStuff 方法:
var objB = _.extend(objA, {
doStuff: function() {
// do objB stuff
}
});
但是,现在当调用 objB.doStuff() 时,仅完成 objB 的工作。
我希望 objA 和 objB 都完成。我尝试了以下方法:
var objB = _.extend(objA, {
doStuff: function() {
this.prototype.doStuff.call(this, arguments);
// do objB stuff
}
});
objB.__proto__ = objA;
但是这不起作用。我想我不明白扩展对象文字时原型(prototype)继承是如何工作的。那么,正确的方法是什么?
最佳答案
I would like for both objA and objB stuff to be done.
您必须显式调用 objA
的方法:
var objB = _.extend({}, objA, {
doStuff: function() {
objA.doStuff.apply(this, arguments);
// do objB stuff
}
}, objA);
请注意,我添加了一个空对象作为第一个参数,以便首先合并 objA 的属性,然后合并您的属性。有关 _.extend
工作原理的更多信息,请参阅 documentation .
Object Literals and Prototypal Inheritance?
对象文字当前不提供设置原型(prototype)的方法。您可以使用 Object.create
创建具有特定原型(prototype)的空对象。然后将其他属性合并到其中:
var objB = Object.create(objA);
// `merge` is a fictional function that copies properties from object to another
merge(objB, {
doStuff: function() { ... }
});
您仍然只能通过显式引用来调用 objA
的方法。
注意:这部分可能需要在 ES6 最终确定并实现后进行修改。
在ES6中,您可能能够设置原型(prototype) via the __proto__
property name :
var objB = {
__proto__: objA,
doStuff: function() { }
};
或通过 Object.setPrototypeOf
:
var objB = {...};
Object.setPrototypeOf(objB, objA);
然后您应该能够通过 super
关键字调用 objA
的方法:
var objB = {
__proto__: objA,
doStuff: function() {
super.doStuff();
}
};
关于javascript - 对象文字和原型(prototype)继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289896/