假设我有一个名为 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:这是编写“类级”方法的首选方式。这节省了内存(正如您将在 #2 中看到的那样),并且 JS 引擎可以知道每个实例都将具有此方法并围绕它进行优化。
#2:你是对的,这个成本更高,因为它为每个实例创建一个新函数。这里的区别在于您可以包含在构造函数中生成的私有(private)变量。例如:
function MyObject() {
var name = 'Me';
this.getName = function() {
return name;
};
}
只有在构造函数中创建的东西才能访问name
。
#3:这种方法在很大程度上与#1 相同,但我想 JavaScript 引擎并不是为这种情况而编写的(但这可能不是真的,并且可能会改变,JS 引擎是不断发展)。这还会创建一个全局函数(假设您没有使用模块系统),这可能会在以后产生重大问题。
关于javascript - JS中这三种声明方法的方式有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25146417/