需要在构造函数内声明方法而不是将其声明为原型方法的情况示例

时间:2012-04-05 16:18:30

标签: javascript oop prototype

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

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

4 个答案:

答案 0 :(得分:2)

主要用途是模拟私有字段。请在此处查看我的答案:

Declaring javascript object method in constructor function vs. in prototype

答案 1 :(得分: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()
        }
    }
}

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

当然,这引出了在什么情况下你想要使用闭包变量的问题。私密'参数可能会再次出现在这里。另外,here是关于闭包的一些常见用法的讨论。