prototype从on对象继承到另一个

时间:2016-10-10 21:59:16

标签: javascript

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

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

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

但它仅适用于firefox,因为 proto 仅在firefox中可用。

在其他网页浏览器中,如果使用某些构造函数创建a,b,我可以使用

b.constructor.prototype=a;

设置继承关系。

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

有没有办法设置继承关系,除了使用 proto

您的评论欢迎

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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