0

javascript でアーキテクチャのようなクラスを作成しようとしていますが、ある点で立ち往生しています。コードは次のとおりです。

var make = function(args) {
    var priv = args.priv,
        cons = args.cons,
        pub = args.pub;
    return function(consParams) {

        var priv = priv,
            cons = args.cons;

        cons.prototype.constructor = cons;
        cons.prototype = $.extend({}, pub);

        if (!$.isFunction(cons)) {

            throw new Hata(100001);

        }
        return new cons(consParams);
    }
};

返された関数オブジェクトのスコープと cons.prototype のオブジェクト スコープに priv 変数を追加しようとしていますが、作成できませんでした。

make オブジェクトの使用法は次のとおりです。

var myClass = make({
    cons: function() {
        alert(this.acik);
        alert(priv.gizli);
    },
    pub: {
        acik: 'acik'
    },
    priv: {
        gizli: 'gizli'
    }
})
myObj = myClass();

PS: 私がやりたいことを示すためだけに、外側の変数を使用しました。JavaScript関数構造のプライベート変数構文を知っています。しかし、「新しい」(パターン名を忘れた)インスタンス化パターンで使用される関数のスコープを変更(プライベート変数を追加)するための解決策が必要です。

PS: 私の英語を許してください...

4

2 に答える 2

0

クラス構造の後にいる場合は、次のパターンに従う必要があります。

function MyClass(arg){};

重要な注意: 内部クロージャーの var 名を、それが含まれている外部クロージャーと同じ名前に設定すると、同じ名前の元の外部クロージャー変数にアクセスできなくなります。

一方、外側のクロージャ変数にアクセスする必要がある場合は、内側のクロージャ変数に同じ名前を設定する必要はありません。内部クロージャー内にあるかのように変数を操作するだけです。

var make = function(args) {
    var priv = args.priv,
        cons = args.cons,
        pub = args.pub;
    return function(consParams) {

        var someThing = priv,
            sElse     = args.cons;
    }
};

// cons: という名前の関数オブジェクトに var または private 変数を追加する必要がある場合は、以下に示すように、他の関数オブジェクトと同様に追加するだけです。

var myClass = make({
    cons: function() {
         var myPrivateVariable = 'private';
        alert(this.acik);
        alert(priv.gizli);
    },
    pub: {
        acik: 'acik'
    },
    priv: {
        gizli: 'gizli'
    }
})
myObj = myClass();
于 2012-09-01T10:29:46.137 に答える
0

クラスのような構造を複製しようとする場合、Javascript での一般的なアプローチは次のとおりです。

//Constructor
function MyClass(myParam){
  this.myParam = myParam
}

MyClass.prototype.myMethod = function(){
  alert(this.myParam);  //retreives the "class" instance variable myParam
}

//Instantiation
var firstMyClass = new MyClass(7);
firstMyClass.myMethod(); //alerts 7

プロトタイプに追加する関数内では、これは MyClass インスタンスへの参照になることに注意してください。プライベート変数を作成したい場合は、Javascript Expert Douglas Crockford からこのリンクをチェックアウトできます: http://javascript.crockford.com/private.html

于 2012-09-01T09:33:44.723 に答える