javascript - 在 JavaScript 中实例化一个类的闭包
问题描述
我写了一个 JS 简单的类:
// JS simple class
class myClass
{
constructor(init=0) { this.var = init; }
add(n) { this.var+=n; return this; }
sub(n) { this.var-=n; return this; }
}
该类可以与方法链接一起使用:
// Works well
obj1 = new myClass(0);
obj1.add(5);
obj1.sub(2);
console.log (obj1.var);
// Method chaining, works well
obj2 = new myClass(0);
obj2.add(9).sub(4).add(3);
console.log (obj2.var);
为了方便起见,我想创建一个闭包,因此可以在不显式创建新对象的情况下使用该类。例如,我想要类似的东西:
obj(0).add(5).sub(2);
调用时obj(0)
,会创建一个新的类实例。我写了以下闭包,但以下不起作用:
// Closure instantiating the class
var obj = function(init)
{
var obj = new myClass(init)
return { add:this.add, sub:this.sub };
}
调用obj(0).add(3);
时,控制台显示如下错误:
Uncaught TypeError: obj(...).add is not a function at window.onload ((index):58)
我不知道该怎么做,我什至不确定闭包是正确的工具。
请注意,我已经有一个没有类(带闭包)的工作解决方案,但我想保留我的类。
解决方案
您的函数应该返回新对象:
// Closure instantiating the class
var obj = function(init)
{
return new myClass(init);
}
我更新了小提琴:https ://jsfiddle.net/48mr2t5y/
推荐阅读
- regex - 如何在 shell 脚本内的字符串中添加 REGEX?
- python - Python 从 for 循环打印到 excel 或 csv
- sql - 在 Teradata 16.20 中,有没有办法从两个 CTE 更新或合并?
- objective-c - -dead_strip 如何在 Objective-C 代码上工作?
- mysql - 克隆表减去任何键的最快方法
- python - 使用 df.query 在日期时间列中添加或减去天数
- java - 如何使用 Java 改进 OpenCV 中的人脸检测
- python - 了解频谱图和 n_mels 的形状
- angular - “AbstractControl”类型上不存在标识符“控件” - Angular 6
- android-widget - 如何制作 Android 小部件