Javascript 最后定义的原型函数始终在对象初始化时运行

Javascript 最后定义的原型函数始终在对象初始化时运行,javascript,function,object,constructor,prototype,Javascript,Function,Object,Constructor,Prototype,给定以下代码(StoriesMap.js) 我总是得到: Always Called when object is Initialized 在我的控制台里。无论出于何种原因,我上一个定义的原型被视为构造函数,我不知道为什么。我不希望在初始化对象时运行该函数,是否假定它是构造函数?我以前也遇到过这种情况,我的正常反应是创建最后一个名为“fake”的原型函数,并将其保留为空,但这个问题的正确解决方法是什么?此代码在某个点(可能在某种构建过程或小型化过程中)连接了其他代码。另一段代码以括号中的语句开

给定以下代码(StoriesMap.js)

我总是得到:

Always Called when object is Initialized

在我的控制台里。无论出于何种原因,我上一个定义的原型被视为构造函数,我不知道为什么。我不希望在初始化对象时运行该函数,是否假定它是构造函数?我以前也遇到过这种情况,我的正常反应是创建最后一个名为“fake”的原型函数,并将其保留为空,但这个问题的正确解决方法是什么?

此代码在某个点(可能在某种构建过程或小型化过程中)连接了其他代码。另一段代码以括号中的语句开头:

StoriesMap.prototype.fake = function fake() {
    console.log("Always Called when object is Initialized");
}

// start of other code...
(...);
但是,JavaScript将其理解为:

StoriesMap.prototype.fake = function fake() {
    console.log("Always Called when object is Initialized");
}(...);
因此,
StoriesMap.prototype.fake不等于函数,而是使用括号表达式作为参数立即调用函数
StoriesMap.prototype.fake设置为立即调用函数的返回值

只需在函数表达式的末尾添加分号,就不会发生这种情况,因为括号中的语句和函数将用分号分隔:

StoriesMap.prototype.fake = function fake() {
    console.log("Always Called when object is Initialized");
};
(...);
JavaScript的自动分号插入只有在缺少分号会导致违反语言语法时才会发生。有关与此类似的示例,请参见的底部:

源头

a = b + c
(d + e).print()
不会通过自动分号插入进行转换,因为第二行开头的括号表达式可以解释为函数调用的参数列表:

a = b + c(d + e).print()
在赋值语句必须以左括号开头的情况下,程序员最好在前面语句的末尾提供一个显式分号,而不是依赖自动插入分号


向我们展示
/*code*/
。我无法复制。你有一个误发的
()
吗?那么你告诉我们,只要有这个代码,你就可以记录信息了?老实说@SLaks:很好。可能在最后一个原型方法之后还有一个生命。不,事实并非如此。可能有一些其他代码调用您的上一个原型,所以请按照要求向我们展示您的注释代码above@BlueSkies我的意思是他描述的奇怪的行为,不是说没有发生(预期的情况)。谢谢你的澄清。JS多年来,“自动分号插入”仍然令人困惑。
a = b + c
(d + e).print()
a = b + c(d + e).print()