这三种方法在JS中声明方法有什么区别吗?

时间:2014-08-05 19:04:41

标签: 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 个答案:

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

查看代码笔:http://codepen.io/sessa/pen/tfqln