为什么在没有新操作符的情况下创建一个新实例



使用此代码(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

最新更新