如何在JavaScript中创建封装的“类”?

时间:2015-01-30 14:48:37

标签: javascript class encapsulation

在JavaScript中,类通常通过构造函数进行模拟。但是,我很好奇如何创建一个封装的类,即一个让它的一些成员保持私密的类。

常见的创建课程的方法'如下:

function MyClass(parameter) {
    this.value = parameter;
}

MyClass.prototype.myPublicFunction = function() {
    console.log("About to run private function.");
    myPrivateFunction();
};

MyClass.prototype.myPrivateFunction = function() {
    ...
};

如您所见,在此示例中,myPrivateFunction实际上是公开的。我已经看到解决这个问题的一种方法如下:

function MyClass(parameter) {
    this.value = parameter;

    this.myPublicFunction = function() {
        console.log("About to run private function.");
        myPrivateFunction.call(this);
    }

    function myPrivateFunction() {
        ...
    }
}

这有效; myPrivateFunction无法从外部访问。但是这种方法存在一个问题 - 这个课程中的所有功能都可以解决问题。将跨实例复制,而不是通过prototype共享。在任何地方使用privateFunction.call(this)并不是很棒。

非功能成员也一样。如何在类中定义私有实例成员?什么是最好的,什么是最常见的方法?简单地依赖命名约定(例如使用_开始私有函数名称)是否可以接受?

1 个答案:

答案 0 :(得分:2)

您可以创建一个范围来隐藏具有自动执行功能的私有函数。

像:

(function(){
    function myPrivateFunction(arg_a, arg_b) {
        /* ... */
        console.log("From priv. function " + this.value);
    }
    window.MyClass = function(parameter) {
        this.value = parameter;

        this.myPublicFunction = function() {
            console.log("About to run private function.");
            myPrivateFunction.call(this, 'arg_a', 'arg_b');
        }

    }
})();

但是,只有在声明它之后才需要使用MyClass,因为它现在是函数表达式而不是函数语句,但MyClass的所有实例将共享{{1}的相同实例}}。但您需要使用myPrivateFunction(与Function.prototype.call中一样,以获取myPrivateFunction.call(this, 'arg_a', 'arg_b');关键字的值以匹配您的实例。 如果仅this,则关键字myPrivateFunction('arg_a, 'arg_b');将指向全局对象(浏览器上为this)或window如果启用了null

请注意:在我自己的代码中,我不这样做,但在不使用某些框架时依赖于'strict mode'等命名约定。