1

JavaScript 言語は、クラスまたはクラスベースの継承を直接サポートしていません。

ただし、JavaScript には多数のクラスの実装があります。

私が見たすべての実装では、自己呼び出し関数を使用して、プライベートでインスタンスベースの効率的な関数を作成する必要があります。

関数にはプライバシーがあります

var foo = function(){ /* private to foo here */ };

しかし、それを元にプロトタイプを作成すると、公開されたインスタンス ベースの効率的なメンバーが作成されます。

foo.prototype.func = function(){ /* private to func */ }; // foo.func in public now.

このようにfooに関数を配置すると

var foo = function() { 
    var funcInner = function(){}; 
}; // funcInner is now re-defined in each call to foo.  In-efficient.

欠けているプラ​​イバシーを手に入れることができますが、非効率性があります。

したがって、プライベートでインスタンスベースの効率的な関数を持つ唯一の方法は、モジュール パターン (または同様の自己呼び出しパターン) をそのまま使用することです。

    var NS = (function(){ 
    var private = function(){ /* code */ }; // only created once b.c. in module pattern.
    var publik = {};
        publik.funcPublic = function(){ /* code */ };
    return publik;
})();

通話中

NS.funcPublic();

このことから、プライベートなインスタンス ベースの効率的な関数を使用するには、わずかな実行時間が必要になると思われますか?

これは正しいです?

4

2 に答える 2

1

あなたが提示したモジュールパターンは良い解決策ではありません。object を返しますpublikが、ほとんどの場合、クラスをシミュレートしたいと思いますよね? newしたがって、演算子を使用して type の新しいインスタンスを作成するつもりだと思いますpublik。これはオブジェクトでは機能しないため、新しいインスタンスを作成するときはいつでもこの無名関数を呼び出す必要があります。インスタンスごとに新しいプライベート関数が作成されます。(これが理解できるかどうかわからないので、説明が必要な場合は質問してください!)

実際にはかなりうまく機能するソリューションを提供する必要があります。

var Car = (function() {
    // Private functions as local variables:
    var privateFunc = function(self) {};        

    // Create a local variable that will be the class (a function, to
    // enable the "new" keyword.
    var Car = function() {};

    // Attach public methods to the prototype! That's the most efficient way.
    Car.prototype.publicFunc = function() {
        privateFunc(this); // the private functions needs probably
                           // to know about the current instance
    };

    // Now return only the completed "class", to get it out into the wild
    return Car;
})();

var bmw = new Car();
bmw.publicFunc();
于 2012-08-11T21:51:57.060 に答える
1

よく分からない。すぐに呼び出される関数 (iif) から作成されたオブジェクト内で物事をプライベートに保つことですか? では、これはあなたが意図したものでしょうか?

var x = (function(){ 
    var n = 1;                                          //n = private
    var getSetN = function(val){ n+=val||0; return n; } // getSetN = private
    var public = function(){};
    public.prototype.getset = function(val){ return getSetN(val||0); };
    return public;
}());
var y = new x; z = new x;
y.getset(1);  //=> 2
y.getset(5);  //=> 7
z.getset(1);  //=> 8
y.getset();   //=> 8

したがって、プライベート変数と関数が使用される iif から配信されたコンストラクターからインスタンスを作成できます。

于 2012-08-11T22:02:29.577 に答える