我tried更好地理解为什么一个(或不应该)从Object(var o = Object.create(null);
)继承。如果我的答案是对的,性能原因似乎是从null“继承”的主要原因。
所以,我想检查一下(使用名为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
继承时没有性能损失?
答案 0 :(得分:0)
是的,没有性能损失。
为什么会这样?它没有[[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方法你自己的。)
除此之外,我认为没有真正的用例。它可能稍微快一些,或占用的内存略少。
答案 1 :(得分:0)
我重新考虑了我自己的代码并略微修改了代码,使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>
通过这种方式,我在访问o1
属性时获得了10%的更好结果。