为什么Object.create()和new Object()会评估不同的原型?

shm*_*uli 21 javascript prototype instantiation

为什么这两个实现的行为不同?在评估他们的原型时,究竟是什么让他们与众不同?

使用指定的原型创建对象:

   function Foo() {}

   // creates an object with a specified prototype
   var bar = Object.create(Foo);

   console.log(Object.getPrototypeOf(bar)); // returns: function Foo(){}
   console.log(Foo.isPrototypeOf(bar)); // returns: true
Run Code Online (Sandbox Code Playgroud)

使用构造方法创建对象:

   function Foo() {}

   // creates an object with the constructor method    
   var bar = new Foo();

   console.log(Object.getPrototypeOf(bar)); // returns: Foo {}
   console.log(Foo.isPrototypeOf(bar)); // returns: false
Run Code Online (Sandbox Code Playgroud)

另外,为什么第二个实现返回Foo {}和false?

joe*_*ews 22

Object.create(Foo)意思是"用Foo原型创建一个对象".

new Foo()表示"使用Foo.prototype原型和Foo构造函数创建对象".

因此Foo是原型的Bar在第一实施例和构造的Bar在第二个例子.

我认为问题的第二部分是由误导性的控制台输出引起的 - Object.getPrototypeOf(bar)实际上是返回Foo.prototype,而不是Foo:

function Foo() {}
var bar = new Foo();

Object.getPrototypeOf(bar) === Foo
// -> false

Object.getPrototypeOf(bar) === Foo.prototype
// -> true
Run Code Online (Sandbox Code Playgroud)


Cha*_*adF 11

当您使用'new'关键字来实例化对象时,JavaScript实际上会在您的对象中添加两行代码.

如果您打算使用伪经典实例化创建对象,则可以像这样创建对象:

var Foo = function() {
this.property = 'baz';
};
Run Code Online (Sandbox Code Playgroud)

当您调用var bar = new Foo()Javascript运行Foo时,如下所示:

var Foo = function() {
// ADDED CODE: var this = Object.create(Foo.prototype);
this.property = 'baz';
// ADDED CODE: return this;
Run Code Online (Sandbox Code Playgroud)

使用Object.create创建从新创建的对象到指定对象的委托关系,因此在第一种情况下,bar将其查找委托给Foo,但在第二种情况下,查找委托给Foo.prototype.

您可能会发现此博客文章很有趣.它进入Pseudoclassical实例化(使用new关键字)而不是Prototypal实例化,它不使用new关键字.