假设我有一个名为MyObject
的类型,我想将方法myMethod
添加到其中。以下方式之间是否有任何差异(逻辑上,但也有性能方面)?
#1
function MyObject() {
...
}
MyObject.prototype.myMethod = function() {
...
};
#2
function MyObject() {
this.myMethod = function() {
...
};
...
}
#3
function MyObject() {
this.myMethod = myMethod;
...
}
function myMethod() {
...
}
我不介意知道是否存在性能差异 - 例如如果方式#2成本很高,因为它每次实例化对象时都会单独定义函数 - 但是我主要关心的是结果是否相等。
此外,使用方法#2,这与定义类级别/静态方法的方式不同,它是否有被MyObject.myMethod();
调用的危险?如果myMethod
使用了this
并且MyObject
调用了MyObject
,而不是this
的实例,我认为这会导致问题。那么编译器/解释器是否检查{{1}}是否存在或是否会引发错误?
答案 0 :(得分:2)
#1 :这是写" class-level"的首选方式。方法。这节省了内存(正如您在#2中看到的那样),JS引擎可以知道每个实例都有这种方法并围绕它进行优化。
#2 :你说得对,这个更贵,因为它为每个实例创建了一个新功能。这里的区别在于您可以包含在构造函数中生成的私有变量。例如:
function MyObject() {
var name = 'Me';
this.getName = function() {
return name;
};
}
只有在构造函数中创建的内容才能访问name
。
#3 :这种方法与#1大致相同,但我认为JavaScript引擎不是针对这种情况编写的(但这可能不是真的可能会改变,JS引擎是不断发展)。这也创建了一个全局函数(假设您不使用模块系统),这可能会在以后产生重大问题。
答案 1 :(得分:2)
选项1:您可以在不实例化MyObject的情况下调用我的方法:
MyObject.prototype.myMethod();
选项2:您必须实例化MyObject才能访问myMethod。
这将失败:
MyObject2.myMethod();
Uncaught TypeError: undefined is not a function
这不会:
var myObject = new MyObject2();
myObject.myMethod();