在javascript中为对象创建函数

Lei*_*sen 5 javascript

据我所知,有两种主要方法可以在javascript中为对象创建函数.他们是:

方法A,在构造函数中创建:

function MyObject() {
    this.myFunc1 = function() {
        ...
    }
    this.myFunc2 = function() {
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

方法B,将其添加到原型中:

function MyObject() {
    ...
}

MyObject.prototype.myFunc1 = function() {
    ...
}

MyObject.prototype.myFunc2 = function() {
    ....
}
Run Code Online (Sandbox Code Playgroud)

显然,如果你这样做:

MyObject.myFunc3 = function() {
    ....
}
Run Code Online (Sandbox Code Playgroud)

然后myFunc3将与MyObject本身相关联,而不是与new关键字一起创建的任何新对象.为清楚起见,我们将其称为方法C,即使它不适用于使用new关键字创建新对象.

所以,我想知道两者之间的区别是什么.据我所知,它们在逻辑上具有相同的效果,即使机器上发生的事情有所不同.

如果我猜测我会说唯一真正的区别是当你在方法A中的构造函数中定义它们时,它会为每个创建的对象创建一个全新的函数对象,而方法B只保留它的一个副本(在MyObject中),它指的是它被调用的任何时间.如果是这种情况,你为什么要以另一种方式做到这一点.否则,方法A和方法B之间有什么区别.

hug*_*omg 4

为每个对象提供单独的函数的优点是您可以关闭构造函数中的变量,本质上允许“私有数据”。

function MyObject(a,b) {
    var n = a + b; //private variable
    this.myFunc1 = function() {
        console.log(n);
    }
};
Run Code Online (Sandbox Code Playgroud)

function MyObject(a,b) {
    this.n = a + b; //public variable
}

MyObject.prototype.myFunc1 = function() {
    console.log(this.n);
}
Run Code Online (Sandbox Code Playgroud)

这是否是一个好主意取决于你问的是谁。我个人的立场是在实际使用原型时保留构造函数,如选项 #2 所示,并make_my_object(a,b)在使用闭包时使用普通函数(例如,),如选项 #1 所示。