Закрытие, которое создает экземпляр класса в JavaScript - PullRequest
2 голосов
/ 24 января 2020

Я написал 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 здесь

1 Ответ

1 голос
/ 24 января 2020

Ваша функция должна вернуть новый объект:

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

Я обновил скрипку: https://jsfiddle.net/48mr2t5y/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...