我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效
Object.create(Object.prototype)
Object.create(Object)
Object.create(null)
Object.create(null)
返回一个空对象
Object.create(Object)
返回一个函数,为什么????(我检查了我的日志,它说函数...我使用了 console.dir() )
Object.create(Object)
返回一个非空对象
这整个事情是如何工作的......我更习惯于 Classname .prototype :(
不明白这是怎么回事
前言:JavaScript使用原型(prototype)继承,这意味着一个对象可以有(通常确实有)一个原型(prototype)在它的后面,它是另一个对象。如果您尝试从对象中获取某个属性的值,而该对象不具有该属性,则 JavaScript 引擎会查看该对象的原型(prototype)(及其原型(prototype)等)以找到它。
Object.create
创建对象。您给 Object.create
的第一个参数是用作它创建的对象原型(prototype)的对象。所以:
// 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" | +−−−−−−−−−−−−−−−+
Proof b
uses Một
:
console.log(b.foo); // 42
a.foo = 67;
console.log(b.foo); // 67
解决您的一些变体:
var o = Object.create(Object.prototype);
Điều này có liên quan đến var o = {};
完全相同:它创建一个新的空白对象,其原型(prototype)是对象 Object.prototype
引用。
var o = Object.create(Object);
这将创建一个新的空白对象 o
,其原型(prototype)是 Object
函数。它不创建函数,只是创建一个以函数为原型(prototype)的非函数对象。这会很奇怪,可能不是你想要的。 :-)
var o = Object.create(null);
创建一个新的空白对象o
,其原型(prototype)为null
。因为它的原型(prototype)是 null
,所以它没有通常的 Object.prototype
东西,比如 toString
Và valueOf
Và hasOwnProperty
。这有点不寻常,尽管它有一些用例,例如当您将对象用作字典/ map 并且不希望这些属性名称出现误报时。 (在 ES2015 [又名 ES6] 中,另一种选择是使用 Map
。)
正如 thg435 在下面的评论中指出的那样,关于 JavaScript 的一个令人困惑的事情是对象的原型(prototype)与您在函数上看到的 prototype
属性完全不同。如果 prototype
属性有一个不同的名称可能会更好(尽管我无法想象它会是什么名字而不是非常笨拙)。
一个对象(我们称它为 o
)有一个原型(prototype)对象,它从中继承属性。 (在 ES2015+ 中,您可以通过 Object.getPrototypeOf
访问该对象。)函数的 prototype
属性上的对象根本不一定是任何对象的原型(prototype)。相反,它是Sẽ指定为使用该函数通过 new
创建的任何对象的原型(prototype)的对象。
例子在这里很有帮助。
function Foo() {
}
该函数 Foo
具有引用对象的属性 Foo.prototype
。该对象尚未用作任何事物的原型(prototype)。它只是一个分配给 Foo
对象实例上名为 prototype
的属性的对象。
var f = new Foo();
Hiện nay该对象被用作原型(prototype),具体来说,它是由 new Foo
调用创建的 f
对象的原型(prototype)。
忽略一些细节,这行代码:
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);
正如我所说,这遗漏了一些细节,但希望它有助于阐明函数的 prototype
属性的用途...
Tôi là một lập trình viên xuất sắc, rất giỏi!