2

我了解原型方法由 JavaScript 中对象的所有实例共享。

当你需要另一种情况时,我想不出一个实际的例子——在构造函数中声明方法,从而使对象的每个实例都有自己的方法实例。你能为此提供一个案例吗?

4

4 回答 4

2

主要用途是模拟私有字段。例如,请参阅我的答案:

在构造函数与原型中声明 javascript 对象方法

于 2012-04-05T16:22:26.223 回答
1

但是当您需要其他情况时,我想不出一个实际的例子

那是因为没有实际的例子。

由于会导致不必要的性能损失,在构造函数中声明函数是一种已知的不良做法。

还应该指出,原型很棒,因为它们鼓励可扩展性、灵活性和猴子补丁。这意味着您可以修复其他人的对象,因为一切都可以被拦截和操纵。

闭包就像冻结的物体,它们剥夺了你的灵活性,是操纵、包装或改变的噩梦。

应该注意的是,您不需要使用原型,如果您喜欢,可以使用函数代替

function cake(fruits, chocolate, size) {
    return {
        slice: function () {
            return cakeSliceList(this)
        },
        toString: function () {
            return "A lovely cake containing " + fruits.toString()
                + ", " + chocolate.toString()
        },
        weight: function () {
            return size * CAKE_SIZE + fruits.weight() + chocolate.weight()
        }
    }
}

函数式风格是有效的,将函数式风格与原型结合起来相当愚蠢,相当快。

于 2012-04-05T16:22:05.253 回答
1

我在一定程度上同意@Raynos - 以效率为代价实现私有状态确实是一种不必要且徒劳的做法。

通常,当需要任何类型的状态绑定时,都需要创建函数。因此,当您需要传递明确引用对象状态的函数时,它可能具有实用价值。如果您每次创建状态绑定函数时都会受到惩罚,那么如果您在构造函数中只绑定一次并引用该单个绑定函数而不是多次创建它,那么您将处于有利地位。

有时需要通过您自己的设计选择来进行状态绑定。例如,在初始化时为对象创建状态绑定事件处理程序是有意义的。

于 2012-04-05T16:52:11.947 回答
0

如果您在对象中的任何位置使用闭包,并且需要在函数中引用它们。或者,或者,如果您特别想让您的功能“私有”。

当然,这引出了一个问题,即在什么情况下要使用封闭变量。'private' 参数可能会再次出现在这里。此外,这里讨论了闭包的一些常见用途。

于 2012-04-05T16:27:41.563 回答