2015-11-26 52 views
0

有了这个代码(jsfiddle):如何在没有新操作员的情况下创建新实例?

Animal = function() { 
}; 

Animal.prototype.bark = function() {}; 

Animal.inspect = function() { 
    console.log(this.prototype.hasOwnProperty('bark')); // true 
} 

Animal.inspect(); 

thisinspect似乎是动物(而非全局或window范围)的新实例。

怎么回事?

回答

2

这不是一个Animal实例,但Animal对象本身(Animal实际上不是一个类)

this变量不是(在许多其他语言,如self)的对象实例的等效。这是一个可以持有任何价值的“背景”。这个值可以用许多(令人困惑的)方式来解决。其中之一是在函数调用中,其中函数是对象的成员(并且函数未被称为通过.call.apply指定新的上下文),在这种情况下,它将解析为对象实例。由于Animal是一个对象,因此Animal.inspect有资格作为“方法”,并且在Animal.inspect()中,上下文this已解析为Animal

你可以做的这个小实验:

Animal = function() { 
}; 

Animal.prototype.bark = function() {}; 

Animal.doSomething = function() { 
    this.hello = 'hello'; 
}; 

Animal.doSomething(); 
console.log(Animal.hello); // hello 

顺便提一句,在JS可以完美无new运营商创造新的对象,实际上你没有在定义Animal

+0

JS没有这样的类,但是动物是一个“类”,尽可能多地写入'new Animal()'并获得一个具有'bark'属性的东西的实例(但它将不会有'inspect'属性) –

+0

@ChrisLear我同意,而我没有。 “新动物”不是“动物”的实例,它是代表“动物”的对象。无论如何...让我们不要深入讨论JS的奇怪之处:) – bgusach

+0

@bgusach:当然'新动物instanceof动物'?!该对象(我们称之为实例)委托给'Animal.prototype'。 – Bergi

3

您未创建实例。

您可以在构造函数对象本身上调用inspect()

所以thisAnimal,然后您检查原型(不是当前对象),看它是否有回财产。

2

this内检查似乎是Animal

首先在JavaScript中所有功能的新实例也是对象

,所以当你做以下

Animal.inspect(); 

thisinspect()设置为Animal

+0

好吧,不一定。 – bgusach

+0

@bgusach和为什么不 – Ramanlfc

+0

“这在invoke()”什么“invoke()”? –

相关问题