別のインスタンスのプライベート状態を継承したい場合はありますか? JavaScriptでこれを行うことができます。次のように今、私たちは私たちの基本クラスを作成することができます
function weakBind(functable, prototype, state) {
return function() {
return functable.apply(this, Object.getPrototypeOf(this) === prototype ?
[state].concat(Array.prototype.slice.call(arguments)) : arguments);
};
}
:まず、効用関数を定義する必要が
var Dog = (function() {
function Dog() {
if (this instanceof Dog) {
// constructor code
} else return Object.create(private);
}
var public = Dog.prototype, private = Object.create(public, {
size: {
value: "big"
}
});
public.saySize = weakBind(function (private) {
return "I am a " + private.size + " dog.";
}, public, private);
return Dog;
}());
次のように今、あなたは犬を作成することができます。
var dog = new Dog;
alert(dog.saySize()); // I am a big dog.
alert(dog.size); // undefined
私たちは、次のようにプライベート状態を継承できます。
var Chihuahua = (function() {
function Chihuahua() {
Dog.call(this);
}
var private = Dog();
Object.defineProperty(private, {
size: {
value: "small"
}
});
var public = Chihuahua.prototype = Object.create(Dog.prototype);
public.saySize = weakBind(public.saySize, public, private);
return Chihuahua;
}());
次のように今、あなたはチワワを作成することができます。
var chi = new Chihuahua;
alert(chi.saySize()); // I am a small dog.
alert(chi.size); // undefined
デモを参照してください:http://jsfiddle.net/b3Eyn/
注:を私はちょうどそれがJavaScriptでプライベート状態を継承することは可能だということを示すために、この答えを書きました。しかし、私はあなたにこのパターンを使わないことを勧めます。あなたのコードをうまく設計すれば、まずはプライベートな状態を継承する必要はありません。
この関数は何ですか?Dog =(function(){})() '? – Amberlamps
'private'メンバは、OOPをサポートする_any_言語で定義されているクラス内で_only_で表示されます。私はあなたがしようとしているものを手に入れません。 – Leri
一般的にはありませんが、あなたの「私的関数」は 'notSoPrivateSaySize = new Dog()で簡単にアクセスできます。publicSaySize(); ' – Bergi