我最近偶然发现了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的词法(vs块)类型作用域,这是合乎逻辑的。以上陈述是否正确?我是不是漏掉了什么?什么时候你会使用一个而不是另一个呢?
编辑:链接到上面代码示例的jsfiddle版本:http://jsfiddle.net/rZfYL/
发布于 2010-11-13 00:22:30
在Object.create中使用的对象实际上形成了新对象的原型,而在
()表单中,声明的属性/函数并不形成原型。
是的,Object.create
构建一个对象,该对象直接继承作为其第一个参数传递的对象。
使用构造函数,新创建的对象继承自构造函数的原型,例如:
var o = new SomeConstructor();
在上面的示例中,o
直接从SomeConstructor.prototype
继承。
这里有一个区别,使用Object.create
你可以创建一个不继承任何东西的对象,Object.create(null);
,另一方面,如果你设置了SomeConstructor.prototype = null;
,新创建的对象将从Object.prototype
继承。
您不能像使用函数式语法那样使用Object.create语法创建闭包。给定JavaScript的词法(vs块)类型作用域,这是合乎逻辑的。
嗯,你可以创建闭包,例如使用属性描述符参数:
var o = Object.create({inherited: 1}, {
foo: {
get: (function () { // a closure
var closured = 'foo';
return function () {
return closured+'bar';
};
})()
}
});
o.foo; // "foobar"
请注意,我说的是ECMAScript第五版Object.create
方法,而不是克罗克福德的垫片。
该方法开始在最新的浏览器上实现,请查看此compatibility table。
发布于 2013-07-31 00:12:53
非常简单地说,new X
是额外运行constructor
函数的Object.create(X.prototype)
。(并使constructor
有机会return
应该是表达式结果的实际对象,而不是this
。)
就这样。:)
剩下的答案是令人困惑的,因为显然也没有其他人阅读new的定义。;)
发布于 2013-01-30 07:23:33
以下是两个调用在内部执行的步骤:
(提示:唯一的区别在于第3步)
new Test()
new Object()
objobj.__proto__
设置为createObject.create( Test.prototype )
new Object()
objobj.__proto__
设置为create所以基本上Object.create
不会执行构造函数。
https://stackoverflow.com/questions/4166616
复制相似问题