Javascript でプライベートおよび保護されたプロパティとメソッドを定義するための優れた一般化された方法が、こちらのサイトにあります。Class.create()
ただし、現在のバージョンの Prototype (1.6.0) には、構文を使用してそれらを定義する方法が組み込まれていません。
Prototype を使用するときに、開発者がプライベートおよび保護されたプロパティとメソッドを定義したい場合のベスト プラクティスは何かに興味があります。一般的な方法よりも良い方法はありますか?
Javascript でプライベートおよび保護されたプロパティとメソッドを定義するための優れた一般化された方法が、こちらのサイトにあります。Class.create()
ただし、現在のバージョンの Prototype (1.6.0) には、構文を使用してそれらを定義する方法が組み込まれていません。
Prototype を使用するときに、開発者がプライベートおよび保護されたプロパティとメソッドを定義したい場合のベスト プラクティスは何かに興味があります。一般的な方法よりも良い方法はありますか?
Prototype の Lighthouse には、Prototype の Class.create でこの効果を得ることができない理由を説明する議論があります。
できることは、プロトタイプのコンストラクター関数(初期化)でローカル変数を使用してから、この変数にアクセスしてパブリックメソッドに公開するクロージャーを作成することです。
コード例は次のとおりです。
// properties are directly passed to `create` method
var Person = Class.create({
initialize: function(name) {
// Protected variables
var _myProtectedMember = 'just a test';
this.getProtectedMember = function() {
return _myProtectedMember;
}
this.name = name;
},
say: function(message) {
return this.name + ': ' + message + this.getProtectedMember();
}
});
これがこの主題に関するダグラス・クロックフォードの理論です。
重要なのは、以下の例のように、パブリック メソッドをクロージャーとして追加することです。
Bird = Class.create (Abstract,(function () {
var string = "...and I have wings"; //private instance member
var secret = function () {
return string;
} //private instance method
return {
initialize: function (name) {
this.name = name;
}, //constructor method
say: function (message) {
return this.name + " says: " + message + secret();
} //public method
}
})());
Owl = Class.create (Bird, {
say: function ($super, message) {
return $super(message) + "...tweet";
} //public method
})
var bird = new Bird("Robin"); //instantiate
console.log(bird.say("tweet")); //public method call
var owl = new Owl("Barnie"); //instantiate
console.log(owl.say("hoot")); //public method call inherit & add