gpt4 book ai didi

javascript - 对象文字和原型(prototype)继承?

转载 作者:行者123 更新时间:2023-12-02 16:54:27 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com