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

How can I create encapsulated 'classes' in JavaScript?

本文关键字:封装 创建 JavaScript      更新时间:2023-09-26

在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)也不是很好。

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

您可以创建一个作用域,以使用自动执行函数隐藏私有函数。

喜欢:

(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的所有实例都将共享相同的myPrivateFunction实例。 但是您需要使用 Function.prototype.call(如myPrivateFunction.call(this, 'arg_a', 'arg_b');)来获取 this 关键字的值以匹配您的实例。如果您只myPrivateFunction('arg_a, 'arg_b');关键字this将指向全局对象(window浏览器上)或null如果启用了'strict mode'

请注意:在我自己的代码中,我不这样做,而是在不使用某些框架时依赖于命名约定,例如MyClass.prototype._myPrivateFunction = function(){};