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

标签 javascript underscore.js

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

相关文章:

javascript - 强调某些方法给出意想不到的结果

javascript - 使用循环在事件监听器上传递参数

Javascript:获取img元素的宽度

javascript - 使用 angular-ui-router 带有参数的动态 templateUrl

javascript - Underscore 有一些函数可以将嵌套的对象数组提取到新数组吗?

javascript - 结合 $ 和 _ 以按数据值提取?

javascript - 当我们设置更新的对象时如何在 Backbone 模型上触​​发更改事件

javascript - 使用 javascript 查找两个对象数组中的差异

javascript - 无法在 Protractor 2.5.1 和 jasmine 1.3.1 上运行我的测试用例?

javascript - 如何使用 JS 解释器突出显示 Blockly 错误?