如何在 JavaScript 中创建封装的“类”
How can I create encapsulated 'classes' in JavaScript?
在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(){};
。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 为effect Composer创建GodRays效果过程
- 从javascript创建一个列表
- onkeyup无法动态创建多个文本区域
- 如何使用javascript从主svg对象动态创建svg视图框
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 如何访问声音管理器2创建的声音对象
- 我已经创建了一个jquery转盘,并使用if条件来运行和停止转盘
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 使用Facebook live API创建实时视频对象时的隐私设置
- 在动态创建的元素上获取对特定选择器的引用
- 如何创建带有插槽的vue js组件预加载程序
- 如何在创建键时引用来自同一对象的键
- 如何在 JavaScript 中创建封装的“类”
- 创建对象数组的封装问题
- 创建一个封装角度 js 功能的实用程序模块
- 创建封装数组JS
- 如何封装和创建可维护的JavaScript
- Javascript 对象:如何创建包含工作对象的封装
- 为什么jQuery在try / catch中封装XHR对象创建?