如何在没有new运算符的情况下创建新实例?

时间:2015-11-26 10:18:02

标签: javascript

使用此代码(jsfiddle):

Animal = function() {
};

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

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

Animal.inspect();
this中的{p> inspect似乎是动物的新实例(而不是全局或window范围)。

怎么回事?

3 个答案:

答案 0 :(得分:3)

您没有创建实例。

您在构造函数对象上调用inspect()

因此thisAnimal,然后您检查原型(不是当前对象)以查看它是否具有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