从空对象的“Interiting”似乎没有影响性能
我已经tried更好地理解为什么要从Object(var o = Object.create(null);
)继承一个(或不应该)。如果我的答案是正确的,性能的原因似乎是从null继承的主要可行理由。从空对象的“Interiting”似乎没有影响性能
所以,我想检查(利用体积小,方便和可爱探查称为JSLitmus):
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Title</title>
<script src="JSLitmus.js"></script>
<script>
JSLitmus.test('Prototypeless test', function() {
var o1 = Object.create(null);
o1.foo = "bar";
for (i = 0; i < 1000000; ++i) {
o1.foo;
};
});
JSLitmus.test('Prototypeful test', function() {
var o2 = {};
o2.foo = "bar";
for (i = 0; i < 1000000; ++i) {
o2.foo;
};
});
</script>
</head>
<body>
</body>
</html>
执行时,我得到了相同的(有争议的)结果。这是否意味着从Object
继承时没有性能损失?
我重新考虑我自己的代码,并稍微修改了代码,以使foo
现场查找,通过“继承”链传播:
<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>
这样,我有更好的10%的结果当访问o1
属性。
是的,没有性能损失。
为什么会有?它没有支票[[Prototype]]
,因为foo
是o
的自有财产。
你想从null
继承的原因是建立你自己的原型链。它只是让你控制。
一般来说,你会想从Object.prototype
继承,因为它的方法是有用的,几乎所有的代码类型都“假设”每一件事都从它继承。
但是你可以用特殊的逻辑
var newObject = Object.make(null,{
toString: function () { return "foobar"; },
valueOf: function() { return 42; }
});
创建自己的链的Object.make
一些值,然后只需创建的那个
var o = Object.create(newObject);
console.log(o + 3);
console.log("foo" + o);
Live Example实例。
如果你真的想拥有的.valueOf
细粒度的定制控制等方法,然后实际上它将使意义不从Object.prototype
继承调试目的(即不小心使用的Object.prototype方法,而不是你自己的)。
除此之外,我不认为它有一个真正的用例。它可能稍微快一些,或者占用少量内存。
刚刚重新考虑了主要代码片段并列在我自己的答案上方。我的逻辑是否一致,重点是(偏执性的)“证明”吗? – BreakPhreak
当然你有。因为属性查找不是免费的。然而现代JIT编译器可以将成本降低到接近零,因此它是一种微型优化。 – Raynos
比从零继承没有理由,呵呵。一些冗余的语言功能。并且故事的结尾,我猜:) – BreakPhreak
正确的是_little_点,但是你可以想象人们抱怨说Object.prototype在他们的原型链中是_always_。 – Raynos