可以使用揭示模块模式实现Javascript类吗?

时间:2015-09-06 23:26:34

标签: javascript class closures javascript-objects revealing-module-pattern

当我在Javascript中切换到显示模块模式时,它松了一口气。不再这个,那个,exports.func,that.func.bind(那),function(){that.success();事实上,在我的模块中,不再出现'this'甚至存在,因此更少混乱和更清晰!如果我也可以将相同的概念应用于一个类。这将允许我在类的私有范围内工作,并在底部仅显示公共函数。这是我尝试这样做的,甚至是一个班级?你看到这个实现有什么问题吗?

var TestClass = function(_a) {
    var a = _a;

    function func() { console.log(a); }

    return {
        func: func
    }
};

var tc1 = new TestClass(1);
var tc2 = new TestClass(2);

tc1.func();     //1
tc2.func();     //2

编辑:我称之为'揭示类模式'(下面的w3core给了我这个想法)

var TestClass = function(_a) {
    var a = _a;

    function func() {
        console.log(a);
    }

    this.func = func;
};

TestClass.prototype.shared = function() {
    console.log(5);
};

var tc1 = new TestClass(1);
var tc2 = new TestClass(2);

tc1.func();     //1
tc2.func();     //2

tc1.shared();   //5
tc2.shared();   //5

tc1.constructor;           //function TestClass()
tc1 instanceof TestClass;  //true

这个方法似乎修复了评论中提到的'instanceof'问题。此外,构造函数现在也设置为函数。

1 个答案:

答案 0 :(得分:0)

看一下:

function ClassName (that) {
    var that = that || this;

    function methodName1 () {

    }

    function methodName2 () { 

    }

    that.methodName1 = methodName1;
    that.methodName2 = methodName2;
}

var case1 = new ClassName();
var case2 = new ClassName({ key: "value" });
var case3 = new ClassName(case2);