使用此代码(jsfiddle):
Animal = function() {
};
Animal.prototype.bark = function() {};
Animal.inspect = function() {
console.log( this.prototype.hasOwnProperty( 'bark' ) ); // true
}
Animal.inspect();
this
中的{p> inspect
似乎是动物的新实例(而不是全局或window
范围)。
怎么回事?
答案 0 :(得分:3)
您没有创建实例。
您在构造函数对象上调用inspect()
。
因此this
为Animal
,然后您检查原型(不是当前对象)以查看它是否具有back属性。
答案 1 :(得分: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
时所做的那样。
答案 2 :(得分:2)
inspect中的的新实例
this
似乎是Animal
JavaScript中的所有函数首先也是对象
所以当你执行以下操作时
Animal.inspect();
this
中的 inspect()
设置为Animal