Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.create(Object.prototype)、Object.create(Object)和Object.create(null)之间的差异_Javascript - Fatal编程技术网

Javascript Object.create(Object.prototype)、Object.create(Object)和Object.create(null)之间的差异

Javascript Object.create(Object.prototype)、Object.create(Object)和Object.create(null)之间的差异,javascript,Javascript,我应该为其他人将从中继承的第一个父对象传递哪个参数,以及哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.create(null) Object.create(null)返回一个空对象 Object.create(Object)返回一个函数why???(我检查了日志,它显示function…我使用了console.dir()) Object.create(Object)返回一个非空对象 这整件事是怎

我应该为其他人将从中继承的第一个父对象传递哪个参数,以及哪个参数更有效

Object.create(Object.prototype)

Object.create(Object)

Object.create(null)  
Object.create(null)
返回一个空对象

Object.create(Object)
返回一个函数why???(我检查了日志,它显示function…我使用了console.dir())

Object.create(Object)
返回一个非空对象

这整件事是怎么运作的。。。我更习惯于类名。原型:(


无法理解这里发生了什么

序言:JavaScript使用原型继承,这意味着一个对象背后可以(通常确实)有一个原型,这是另一个对象。如果您试图从一个对象获取一个属性的值,而该对象没有,JavaScript引擎会查看该对象的原型(以及它的原型等等)来找到它

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" | +−−−−−−−−−−−−−−−+ 解决您的一些变体:

var o = Object.create(Object.prototype);
这与
var o={};
完全相同:它创建一个新的空白对象,其原型是对象
object.prototype
引用

var o = Object.create(Object);
这将创建一个新的空白对象
o
,其原型是
对象
函数。它不创建函数,只创建一个非函数对象,该对象有一个函数作为其原型。这将非常奇怪,可能不是您想要的。:-)

创建一个新的空白对象
o
,其原型为
null
。由于其原型为
null
,因此它没有通常的
对象。原型
内容,如
toString
valueOf
hasOwnProperty
。这有点不寻常,尽管它有一些用例,例如当您将对象重新用作字典/映射,并且不希望这些属性名称出现误报。(在ES2015[aka ES6]中,另一个选项是使用
map


正如thg435在下面的评论中指出的那样,JavaScript令人困惑的一点是,对象的原型与您在函数上看到的
prototype
属性完全不同。如果
prototype
属性有不同的名称,可能会更好(虽然我无法想象它的名字会是什么,但它会非常笨重)

对象(我们称之为
o
)有一个从中继承属性的原型对象。(在ES2015+中,您可以通过
object.getPrototypeOf
访问该对象)函数的
prototype
属性上的对象不一定是任何对象的原型。相反,它将被指定为使用该函数通过
new
创建的任何对象的原型

这里的例子很有用

function Foo() {
}
该函数名为
Foo
,它有一个属性
Foo.prototype
,该属性引用一个对象。该对象还没有用作任何对象的原型。它只是一个在
Foo
对象实例上分配给名为
prototype
的属性的对象

var f = new Foo();
现在该对象被用作原型,特别是它是由
new 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);

正如我所说,这遗漏了一些细节,但希望它有助于澄清函数的
原型属性是用于什么的…

返回的是对象

>>> typeof Object.create(Object)
<<< "object"
>>> Object.create(Object)
<<< Function {}
//           ^^
因此,将
对象
作为原型的对象也将通过原型链链接到功能原型:

>>> Object.create(Object).call === Function.prototype.call
<<< true
>>Object.create(Object.call===Function.prototype.call

哪一个返回一个
函数
?您已经列出了
对象。创建(对象)
两次,所有3个变体都会向我返回一个对象。哦,在Chrome
对象中。创建(对象)
返回一个
函数,我明白了。似乎是由于传递了一个构造函数而不是一个普通对象作为原型而导致的错误行为。哇,这太糟糕了。
var a=object.create(object);a.call;//function call(){[native code]};a();//TypeError:object不是函数
将其粘贴到chrome控制台中,并查看它返回的内容(注意:一次一行)var k=object.create(object);console.dir(k);检查它是什么returns@FabrícioMatté:一点也不麻烦,对象是以函数作为原型的,所以它上面有函数的东西。javascript中最大的困惑可能是
x.prototype
prototype of x
是不同的东西。@Nav:我在answ的更新中尝试过解释它er.:-@Nav:因为您将方法附加到
A.prototype
而不是
A
,所以您将执行
Object.create(A.prototype)
。让子类的实例从父构造函数继承(或者通常让对象从函数继承)是没有意义的@Nav:是的,我很抱歉地说,在web上,你会发现很多在JavaScript中执行继承的相互冲突的(和一些完全错误的)方法,特别是当你使用的层次结构超过两个层次时(例如,不只是Parent@BharathvajGanesan:那么?你问的是它是不是空的,而不是它是不是“普通的”“普通对象”没有公认的定义。我能想到的最明显的定义(直接从
对象继承。prototype
)对于
对象返回的对象是false。create({})
,因为它不是直接从
Object.prototype
继承的。而空对象是没有属性的对象。
>>> typeof Object.create(Object)
<<< "object"
>>> Object.create(Object)
<<< Function {}
//           ^^
>>> Object.call === Function.prototype.call
<<< true
>>> Object.create(Object).call === Function.prototype.call
<<< true