Javascript &引用;插播;来自空对象似乎不会影响性能
我必须更好地理解为什么应该(或不应该)从对象继承(Javascript &引用;插播;来自空对象似乎不会影响性能,javascript,profiling,Javascript,Profiling,我必须更好地理解为什么应该(或不应该)从对象继承(var o=Object.create(null);)。如果我的答案是正确的,那么性能原因似乎是从null“继承”的主要可行原因 所以,我想检查一下(使用小巧、方便、可爱的分析器,名为): 标题 test('Prototypeless test',function(){ var o1=Object.create(null); o1.foo=“bar”; 对于(i=0;i
var o=Object.create(null);
)。如果我的答案是正确的,那么性能原因似乎是从null“继承”的主要可行原因
所以,我想检查一下(使用小巧、方便、可爱的分析器,名为):
标题
test('Prototypeless test',function(){
var o1=Object.create(null);
o1.foo=“bar”;
对于(i=0;i<1000000;++i){
o1.foo;
};
});
test('Prototypeful test',function(){
var o2={};
o2.foo=“巴”;
对于(i=0;i<1000000;++i){
o2.foo;
};
});
当执行时,我得到了相同的(有争议的)结果。这是否意味着从
对象继承时没有性能损失 是的,没有绩效处罚
为什么会有?它没有检查[[Prototype]]
,因为foo
是o
的自有属性
您希望从null
继承的原因是构建自己的原型链。它只是让你控制
一般来说,您会希望继承自Object.prototype
,因为它上面的方法很有用,几乎所有的代码都“假定”所有东西都继承自它
但是,您可以使用特殊的逻辑创建自己的链
var newObject = Object.make(null,{
toString: function () { return "foobar"; },
valueOf: function () { return 42; }
});
为了一些价值
然后只需创建它的实例
var o = Object.create(newObject);
console.log(o + 3);
console.log("foo" + o);
如果您确实希望对.valueOf
和其他方法进行细粒度自定义控制,那么出于调试目的(即,不要意外地使用Object.prototype方法而不是您自己的方法),不从Object.prototype
继承是有意义的
除此之外,我认为它没有真正的使用案例。它可能会稍微快一点,或者占用的内存会稍微少一点。我重新考虑了自己的代码,并稍微修改了代码,使foo
字段查找通过“继承”链传播:
标题
var o1=Object.create(null);
o1.foo=“bar”;
var o2=对象。创建(o1);
var计数;
test('Prototypeless test',function(){
而(--计数){
o1.foo;
};
});
test('Prototypeful test',function(){
而(--计数){
o2.foo;
};
});
这样,当访问o1
属性时,我的结果提高了10% 只是重新考虑了主要代码片段,并在上面列出了我自己的答案。我的逻辑是一致的吗?关键是(偏执地:)“证明了”,拜托?当然了。因为属性查找不是免费的。然而,现代JIT编译器可以将成本降低到接近于零,因此这是一个微观优化。相比之下,没有理由从null“继承”,嗯。一些冗余的语言特性。故事的结尾,我想:)没错,没什么意义,但是你可以想象人们抱怨Object.prototype
总是在他们的原型链中。
var o = Object.create(newObject);
console.log(o + 3);
console.log("foo" + o);
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Title</title>
<script src="JSLitmus.js"></script>
<script>
var o1 = Object.create(null);
o1.foo = "bar";
var o2 = Object.create(o1);
var count;
JSLitmus.test('Prototypeless test', function() {
while(--count) {
o1.foo;
};
});
JSLitmus.test('Prototypeful test', function() {
while(--count) {
o2.foo;
};
});
</script>
</head>
<body>
</body>
</html>