使用此代码(jsfiddle):
Animal = function() {
};
Animal.prototype.bark = function() {};
Animal.inspect = function() {
console.log( this.prototype.hasOwnProperty( 'bark' ) ); // true
}
Animal.inspect();
inspect
中的this
似乎是Animal的一个新实例(而不是全局或window
范围)。
为什么?
您没有创建实例。
您可以在构造函数对象本身上调用inspect()
。
所以this
就是Animal
,然后检查原型(而不是当前对象),看看它是否具有back属性。
它不是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
时所做的那样。
inspect中的
this
似乎是Animal
的一个新实例
首先,JavaScript中的函数也是对象
所以当你做以下时
Animal.inspect();
inspect()
中的this
设置为Animal