我在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 ?
您的评论欢迎
答案 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