首页 > 解决方案 > 在 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)

我不知道该怎么做,我什至不确定闭包是正确的工具。

请注意,我已经有一个没有类(带闭包)的工作解决方案,但我想保留我的类。

我在这里做了一个 JSFiddle

标签: javascriptclassclosures

解决方案


您的函数应该返回新对象:

// Closure instantiating the class
var obj = function(init)
{
    return  new myClass(init);
}

我更新了小提琴:https ://jsfiddle.net/48mr2t5y/


推荐阅读