我最近偶然发现了JavaScript中的Object.create()
方法,并试图推断出它与使用new SomeFunction()
创建对象的新实例有何不同,以及何时想要使用其中一个而不是另一个。
考虑下面的例子:
var test = {
val: 1,
func: function() {
return this.val;
}
};
var testA = Object.create(test);
testA.val = 2;
console.log(test.func()); // 1
console.log(testA.func()); // 2
console.log('other test');
var otherTest = function() {
this.val = 1;
this.func = function() {
return this.val;
};
};
var otherTestA = new otherTest();
var otherTestB = new otherTest();
otherTestB.val = 2;
console.log(otherTestA.val); // 1
console.log(otherTestB.val); // 2
console.log(otherTestA.func()); // 1
console.log(otherTestB.func()); // 2
请注意,在这两种情况下观察到相同的行为。在我看来,这两种情况的主要区别是:
Object.create()
中使用的对象实际上形成了新对象的原型,而在new Function()
中声明的属性/函数不形成原型。Object.create()
语法创建闭包。考虑到JavaScript的词法(相对于块)类型范围,这是合乎逻辑的。上述说法正确吗?我是不是遗漏了什么?什么时候你会使用其中一种而不是另一种?
编辑:链接到上述代码示例的jsfiddle版本:http://jsfiddle.net/rZfYL/