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();