1

在像 Java 这样的基于类的语言中,我有时会利用一个类的私有成员可以被同一个类的其他对象访问这一事实。例如,

class BitSet {
    private int[] words;

    public void and(BitSet set) {
        for (int i = 0; i < words.length; i++)
            words[i] &= (i < set.words.length) ? set.words[i] : 0; 
    }
}

现在,我正在使用构造函数模式使用 JavaScript 来创建“私有”成员:

function BitSet() {
    var words = [];

    this.and = function (set) {
        // This is roughly what I'm trying to achieve.
        for (i = 0; i < words.length; i++)
             words[i] &= (i < set.words.length) ? set.words[i] : 0;
    }

    // This would solve the problem,
    // but exposes the implementation of the object and
    // clutters up the API for the user

    this.getWord = function(index) {
        return words[index];
    }
}

我知道我可能应该以不同的方式处理这个问题(而不是那么面向对象)。有人对更好的模式有建议吗?

4

1 回答 1

1

JavaScript 是一种原型的面向对象编程语言,而不是经典的面向对象编程语言。JavaScript 中没有类,但由于原型类同构,您可以将原型建模为类:

function CLASS(prototype) {
    var constructor = prototype.constructor;
    constructor.prototype = prototype;
    return constructor;
}

CLASS函数允许您创建看起来像类的原型。但是它们不是类。与其他语言中的类不同,JavaScript 中的原型没有访问说明符。一切都必须是公开的或隐藏在闭包内

var BitSet = CLASS({
    constructor: function () {
        this.words = [];
    },
    and: function (set) {
        var length = this.words.length, setWords = set.words;
        for (var i = 0; i < length; i++) this.words[i] &= setWords[i] || 0;
    }
});

事实上,JavaScript 没有类或访问说明符是一件好事,因为您真的不需要它们。想想看。你真的需要像 Java 这样的语言中的访问说明符吗?如果一切都是公开的,真的会有这么大的不同吗?以我的拙见,它不会。

有些人认为将所有内容都公开是不好的,因为它会暴露实现细节并不必要地使用户 API 混乱。不对。只是不要记录您希望保密的那些属性。如果用户不需要了解某个属性,那么就不要记录它。

如果出于安全目的需要将变量设为私有,那么 JavaScript 有闭包。无论如何,这些属性不应该被其他对象(即使是同一个类)访问。因此,不应该出现需要将变量保持为私有并使其也可供其他对象类访问的情况。

最后,将属性公开有很多优点:

  1. 由于该属性是公共的,因此您无需在构造函数中创建闭包。
  2. 方法可以在原型上共享。因此类的所有实例共享方法。
  3. 您可以将对象初始化与对象的方法分开。
  4. 代码更具可读性和可维护性。
  5. 对象创建速度更快。
于 2013-10-10T01:58:04.233 回答