The MDN hints that using .setPrototypeOf()
will have a bad influence on the future performance of your code.
I also read a few Questions about why changing the [[Prototype]] of an object will lower the performance. But none of the answers really explained whats going on in the background. So I wonder if this also applies for new Objects.
In particular I really like to do things like this:
var MyPrototype = {
method1 : function(){...},
method2 : function(){...},
...
};
var newObject = Object.setPrototypeOf({
property : 1,
property2 : 'text'
}, MyPrototype);
Unfortunately you can't do this with Object.create
since it doesn't accept a plain object literal.
Does my use of setPrototypeOf
also decrease the performance of the executing JS engine?
The MDN hints that using .setPrototypeOf()
will have a bad influence on the future performance of your code.
I also read a few Questions about why changing the [[Prototype]] of an object will lower the performance. But none of the answers really explained whats going on in the background. So I wonder if this also applies for new Objects.
In particular I really like to do things like this:
var MyPrototype = {
method1 : function(){...},
method2 : function(){...},
...
};
var newObject = Object.setPrototypeOf({
property : 1,
property2 : 'text'
}, MyPrototype);
Unfortunately you can't do this with Object.create
since it doesn't accept a plain object literal.
Does my use of setPrototypeOf
also decrease the performance of the executing JS engine?
Object.create()
properties object is too heavy for most cases. I'd prefer to just write the usual object literal. You can avoid a lot of plexity without the additional sub- objects with the value
property.
– Jovan
Commented
Sep 7, 2015 at 19:09
new
, it's much easier.
– Data
Commented
Sep 7, 2015 at 19:14
setPrototypeOf()
really is (or will have) a large negative performance impact. But there's nothing saying that it actually does have a negative performance impact. The Firefox JavaScript console, too, gives the same warning. Why is that?
– user5670895
Commented
Oct 30, 2015 at 15:11
If you fear (as apparently you should..) the performance impact of using Object.setPrototypeOf()
, but want to keep your object creation syntax similar to how your code is structured, try this:
var MyPrototype = {
method1 : function(){...},
method2 : function(){...},
...
};
var newObject = Object.assign(Object.create(MyPrototype), {
property : 1,
property2 : 'text'
});
Another option is to merge the object literal with a shallow copy of myPrototype
, although this may not be your desire.
var MyPrototype = {
method1 : function(){},
method2 : function(){}
};
var newObject = Object.assign({
property : 1,
property2 : 'text'
}, MyPrototype);