0

私はjavascriptでクラスを次のように定義しています

    Class = (function() {
    var privateFunction = function() { return "private"; }
    return { publicFunction: function() { return privateFunction("public"); } };
    )();

ここで、ユーザーはClass.publicFunctionにアクセスできますが、 Class.privateFunctionにはアクセスできませ

ここで、このクラスを拡張するためのインターフェースをユーザーに提供したいと思います。そこで、パブリック関数extendを追加しました。

    Class = (function() {
            var privateFunction = function() { return "private"; }
            return { 
                    publicFunction: function() { return privateFunction("public"); } 
                    extend: function(source) { 
                            dest=this;
                            for(var prop in source)dest[prop] = source[prop]
                    }
            };
    )();

私の目的は、extend属性を次のように使用することでした

    Class.extend({
            someFunc: function() { return privateFunction("hooray"); }
    });

としてアクセスします

    Class.someFunc()

私が直面している問題は、拡張関数someFuncでのprivateFunction()の呼び出しが利用できないことです。それがスコープの問題であることは理解できますが、とにかく私のニーズを解決することはできますか。

4

2 に答える 2

0

これはカプセル化の恐ろしい違反ですが、追加したい関数を文字列として渡し、それを次のように入力することevalで、説明したことを実行できextendます。

Class.extend({
        someFunc: 'function() { return privateFunction("hooray"); }'
});

そしてextend関数で、変更します

                        for(var prop in source)dest[prop] = source[prop]

                        for(var prop in source)dest[prop] = eval(source[prop])
于 2011-06-08T15:36:47.993 に答える
0
this.before = function(){return "public"};
this.publicFucntion = function(){privateFunction(this.before());}

次に、this.beforeをオーバーライドします。

于 2011-06-08T15:42:48.237 に答える