javascript - JS中这三种声明方法的方式有什么区别吗?

标签 javascript methods prototype

假设我有一个名为 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/

相关文章:

javascript - 无法在javascript中显示以前隐藏的图像

javascript - 为什么 JavaScript 的 `function.call` 必须显式调用?

c# - 使用 Moq 验证方法调用

javascript - 如何编写这个以在 onclick 上工作

javascript - 文本区域线条检测

javascript - 不使用 JQuery 滚动到元素

c# - 事件处理程序与方法

Java 方法打印其他内容

javascript - 一个(有点晦涩的)Javascript 继承问题

javascript - IE 中的占位符