【问题标题】:How to make one object inherit from another without using __proto__? [duplicate]如何在不使用 __proto__ 的情况下使一个对象从另一个对象继承? [复制]
【发布时间】:2017-02-19 09:55:12
【问题描述】:

我在Firefox中使用下面的代码来设置两个对象之间的原型继承关系:

var a = {};
var b = {};

b.__proto__ = a;
a.dosomething = function() {
   alert('ok');
};
b.dosomething();  //ok

但它仅适用于 Firefox,因为 __proto__ 仅适用于 Firefox。

在其他网络浏览器中,如果 ab 是使用构造函数创建的,我可以使用

b.constructor.prototype = a;

设置继承关系。

但在上面的例子中,ab 的构造函数都是Object。 我不能改变Object的原型。

除了__proto__,还有什么方法可以设置继承关系吗?

【问题讨论】:

  • 你的意思是__proto__
  • 是的,它是 proto
  • 在上面的代码中你不是将b设置为a的原型吗?在下面的代码中,您为什么使用b.constructor.prototype = a 而不是b.prototype=a?另外你是对的对象是 js 中的母原型,我只是为了更好地理解这个问题。

标签: javascript


【解决方案1】:

您可以使用Object.create。它创建一个对象,其原型是传递给它的对象。

var a = {};
var b = Object.create(a);

a.dosomething = function() {
   alert ('ok');
};
b.dosomething(); // ok

您还可以将Object.setPrototypeOf 用于已存在的对象。如果可以避免的话,你真的,真的应该这样做。这会导致严重的性能问题。

var a = {};
var b = {};

Object.setPrototypeOf(b, a);

a.dosomething = function() {
   alert ('ok');
};
b.dosomething(); // ok

【讨论】:

  • 那只是为了创建新的b(新对象),如果a和b已经存在,我可以设置继承关系吗?
  • @arachide 是的。查看我的编辑。
  • 太棒了!非常感谢
【解决方案2】:

不要更改现有对象的原型

警告:改变对象的[[Prototype]]本质上是 现代 JavaScript 引擎如何优化属性访问,非常 每个浏览器和 JavaScript 引擎中的操作缓慢。这 改变继承对性能的影响是微妙的 远方,并不仅限于所花的时间 obj.__proto__ = ... 声明,但可以扩展到任何代码 有权访问[[Prototype]] 已更改的任何 对象。 如果您关心性能,则应避免设置 [[Prototype]] 的对象。相反,使用 想要的[[Prototype]] 使用Object.create()

如果你这样做,标准方式是Object.setPrototypeOf,而不是__proto__

正确的方法是

var a = {};
var b = Object.create(a);
a.dosomething = function(){
  console.log('ok');
};
b.dosomething();

您的b.constructor.prototype = a; 方法毫无用处。如果b 是构造函数C 的实例,则该代码只会影响更改后构造的实例,而不会影响b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2020-04-12
    • 1970-01-01
    • 2022-10-30
    • 1970-01-01
    相关资源
    最近更新 更多