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关键字.