在javascript中为对象创建函数

在javascript中为对象创建函数,javascript,Javascript,据我所知,在javascript中为对象创建函数有两种主要方法。它们是: 方法A,在构造函数中设置它: function MyObject() { this.myFunc1 = function() { ... } this.myFunc2 = function() { ... } ... } 方法B,将其添加到原型中: function MyObject() { ... } MyObject.prototype

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

方法A,在构造函数中设置它:

function MyObject() {
    this.myFunc1 = function() {
        ...
    }
    this.myFunc2 = function() {
        ...
    }
    ...
}
方法B,将其添加到原型中:

function MyObject() {
    ...
}

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

MyObject.prototype.myFunc2 = function() {
    ....
}
显然,如果你这样做了:

MyObject.myFunc3 = function() {
    ....
}
然后
myFunc3
将与MyObject本身关联,而不是使用
new
关键字创建任何新对象。为了清楚起见,我们将其称为方法C,即使它不适用于使用
new
关键字创建新对象

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


如果我猜的话,我会说唯一真正的区别是当你在构造函数中定义它们时,就像在方法A中一样,它会为每个创建的对象创建一个全新的函数对象,而方法B只保留它的一个副本(在MyObject中),它在任何时候被调用都会引用。如果是这样的话,你为什么要用一种方法而不是另一种方法呢。否则,方法A和方法B之间的区别是什么。

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

vs



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

想法是您可以随时修改原型和该类型的所有对象(即使是在修改之前创建的对象)将继承更改。这是因为,正如您所提到的,原型不会随每个新实例一起复制。

方法A中的
MyObject
是内部函数的实例。 除非对象(可以称之为类)被实例化,否则不能在对象外部显式调用其函数

假设:

MyObject.MyFunc1(); // will not work
var obj = new MyObject();
obj.MyFunc1(); // will work
所以这和其他语言中的任何类都是一样的。不过,描述类的有用性及其用法超出了这个问题

另请注意:

    function MyObject() {
        var privateVar = "foo";

        this.publicProperty = "bar";

        // public function
        this.publicFunc = function() {
            ...
        }

        // private function
        function privateFunc () {
            ...
        }
    }
对于方法B而言,与方法A相同,唯一的区别在于原型设计是一种创建对象的风格。有些人出于可读性或偏好而使用原型。 原型的主要优点是可以扩展现有对象,而无需接触原始源。不过你得小心点。 (作为示例原型框架)

对于方法C,您可以将它们称为静态函数。正如您所说的,可以通过如下对象引用来显式调用它们:

MyObject.MyFunc1();

因此,使用哪种方法取决于您所处理的情况。

您也可以在对象中创建函数,如read about the module pattern:@CoreyFarwell,我假设它与方法A的作用基本相同,是吗?在方法B中,方法也是实例方法。你有没有被他的假想和未标记的“方法C”搞混了?没有,我明白你的意思了。我明确地将其标记为方法c,即使它对于使用
new
关键字创建新对象并不起作用。@missingno是的,对不起。不知怎的,我眼前一亮。正确答案
    function MyObject() {
        var privateVar = "foo";

        this.publicProperty = "bar";

        // public function
        this.publicFunc = function() {
            ...
        }

        // private function
        function privateFunc () {
            ...
        }
    }
MyObject.MyFunc1();