最近,我偶然发现了Object.create()JavaScript中的方法,并试图推断该方法与使用创建对象的新实例有何不同new SomeFunction(),以及何时要使用一个实例。
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
请注意,在两种情况下都观察到相同的行为。在我看来,这两种情况之间的主要区别是:
new Function()
以上说法正确吗?我想念什么吗?您什么时候可以使用另一个?
Object.create中使用的对象实际上构成了新对象的原型,而与newFunction()一样,声明的属性/函数不构成原型。
是的,Object.create构建一个对象,该对象直接从作为其第一个参数传递的对象继承。
Object.create
使用构造函数,新创建的对象将从构造函数的原型继承,例如:
var o = new SomeConstructor();
在上面的示例中,o直接继承自SomeConstructor.prototype。
o
SomeConstructor.prototype
这里有一个区别,另一方面,Object.create您可以创建一个不继承任何对象的对象,Object.create(null);另一方面,如果您设置SomeConstructor.prototype = null;了新创建的对象将继承自的对象Object.prototype。
Object.create(null);
SomeConstructor.prototype = null;
Object.prototype
您不能像使用功能语法那样使用Object.create语法创建闭包。给定JavaScript的词法(与块)类型范围,这是合乎逻辑的。
好了,您可以创建闭包,例如使用属性描述符参数:
var o = Object.create({inherited: 1}, { foo: { get: (function () { // a closure var closured = 'foo'; return function () { return closured+'bar'; }; })() } }); o.foo; // "foobar"
请注意,我在谈论的是ECMAScript 5th Edition Object.create方法,而不是Crockford的shim。