Object.create(Object.prototype) Object.create(Object) Object.create(null)
Object.create(null)返回一个空对象
Object.create(Object)返回一个函数为什么????(我检查了我的日志,它表示功能…我用console.dir())
Object.create(Object)返回一个非空对象
这整个事情如何工作…我更习惯了Classname .prototype事情:(
不明白这里发生了什么
解决方法
Object.create创建对象.给出Object.create的第一个参数是用作其创建的对象的原型的对象.所以:
// Create an object with a property 'foo' var a = { foo: 42 }; // Create a blank object using `a` as its prototype var b = Object.create(a); // Give `b` a property of its own b.bar = "hi";
这让我们记住了:
+---------------+ +-------------------+ | [[Prototype]] |----->| (the standard | a----------------------+-->| foo: 42 | | object prototype) | | +---------------+ +-------------------+ | +---------------+ | b-->| [[Prototype]] |--+ | bar: "hi" | +---------------+
证明b使用:
console.log(b.foo); // 42 a.foo = 67; console.log(b.foo); // 67
解决您的某些变体:
var o = Object.create(Object.prototype);
这是无意义的,只需使用var o = {};它做同样的事情(创建一个新的空白对象,其原型是Object.prototype).
var o = Object.create(Object);
创建一个新的空白对象o其原型是Object函数.它不会创建一个函数,只是一个非函数对象具有作为其原型的函数.这很奇怪,可能不是你想要的.
var o = Object.create(null);
创建一个新的空白对象o其原型为空.由于它的原型是空的,它没有通常的Object.prototype东西,像toString和valueOf和hasOwnProperty.这是有点不寻常,尽管有它的用例,例如当你使用一个对象作为字典/地图,并不想要这些属性名称的误报. (在ES2015 [又称ES6]中,另一个选项是使用Map代替.)
由于thg435在下面的评论中指出,关于JavaScript的一个令人困惑的事情是,对象的原型与您在功能上看到的原型属性完全不同.如果原型属性具有不同的名称(尽管我无法想象没有大量笨拙的名称),这可能会更好.
一个对象(我们称之为o)有一个原型对象,它继承了属性.函数的原型属性上的对象根本不一定是任何对象的原型.相反,它将被分配为通过new使用该函数创建的任何对象的原型.
示例在此帮助.
function Foo() { }
该函数Foo具有引用对象的属性Foo.prototype.那个对象还没有被用作任何东西的原型.它只是一个分配给Foo对象实例上称为prototype的属性的对象.
var f = new Foo();
现在该对象被用作一个原型,具体来说它是由新的Foo调用创建的f对象的原型.
忽略了一些细节,这一行代码:
var f = new Foo();
…基本上这样做:
// Create a blank object,giving it `Foo.prototype` as its prototype var f = Object.create(Foo.prototype); // Call` Foo` using that new object as `this` Foo.call(f);