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

Javascript 为什么在没有新操作符的情况下创建新实例?,javascript,Javascript,使用以下代码(): 这个内的检查似乎是动物的一个新实例(而不是全局或窗口范围) 为什么呢?它不是动物的实例,而是动物对象本身(动物实际上不是类) this变量不是对象实例的等价物(如许多其他语言中的self)。它是一个“上下文”,可以包含任何值。此值可以通过多种(令人困惑的)方式解决。其中一个在函数调用中,函数是对象的成员(函数不是通过.call或.apply指定新上下文调用的),在这种情况下,函数将解析为对象实例。由于Animal是一个对象,Animal.inspect限定为“方法”,在Ani

使用以下代码():

这个
内的
检查
似乎是动物的一个新实例(而不是全局或
窗口
范围)


为什么呢?

它不是
动物的实例,而是
动物
对象本身(
动物
实际上不是类)

this
变量不是对象实例的等价物(如许多其他语言中的
self
)。它是一个“上下文”,可以包含任何值。此值可以通过多种(令人困惑的)方式解决。其中一个在函数调用中,函数是对象的成员(函数不是通过
.call
.apply
指定新上下文调用的),在这种情况下,函数将解析为对象实例。由于
Animal
是一个对象,
Animal.inspect
限定为“方法”,在
Animal.inspect()中,上下文
解析为
Animal

你可以做这个小实验:

Animal = function() {
};

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

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

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

顺便说一句,在JS中,您可以在不使用
new
操作符的情况下完美地创建新对象,就像您在定义
Animal
时所做的那样,您没有创建实例

对构造函数对象本身调用
inspect()

因此,
这个
动物
,然后检查原型(不是当前对象)以查看它是否具有back属性

inspect中的这个
似乎是
动物的一个新实例

首先,JavaScript中的函数也是对象

所以当你做下面的事情时

Animal.inspect();

这个
inspect()
中设置为
Animal

JS没有这样的类,但是Animal是一个“类”,它可以编写
新的Animal()
,并获得一个具有
树皮
属性的东西的实例(但它不会有
inspect
属性)@ChrisLear我同意,我没有
new Animal
不是
Animal
的实例,它是在
Animal
上委托的对象。无论如何让我们不要深入讨论JS:)@bgusach的古怪之处:当然
动物的新实例
?!对象(我们称之为实例)确实委托给
Animal.prototype
@Bergi,是的,你是对的。Javascript在很多层次上都被破坏了,所以您无法一致地定义任何内容。JS声称没有类,但它提供了
new
instanceof
<代码>动物
是一个函数(因此也是一个对象),您可以“实例化”一个函数。荒谬。嗯,不一定。“这在invoke()”中是什么“invoke()”?@markschultheis很抱歉输入了错误的方法name@bgusach我的意思是在这个调用
Animal.inspect()的上下文中@Ramanlfc,在这种情况下,你完全正确。但是它很容易被弄糊涂,认为在这个函数的内部
这个
是对象的所有者。。。
Animal.inspect();