Chcesz, aby jedna instancja dziedziczyła stan prywatny innej instancji? Oczywiście możesz to zrobić w JavaScript. Najpierw musimy zdefiniować funkcję użytkową:
function weakBind(functable, prototype, state) {
return function() {
return functable.apply(this, Object.getPrototypeOf(this) === prototype ?
[state].concat(Array.prototype.slice.call(arguments)) : arguments);
};
}
Teraz możemy stworzyć naszą klasę bazową, co następuje:
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;
}());
Teraz można tworzyć psa następująco:
var dog = new Dog;
alert(dog.saySize()); // I am a big dog.
alert(dog.size); // undefined
Mamy może dziedziczyć stan prywatny w następujący sposób:
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;
}());
Teraz można utworzyć chihuahua następująco:
var chi = new Chihuahua;
alert(chi.saySize()); // I am a small dog.
alert(chi.size); // undefined
Zobacz Demo: http://jsfiddle.net/b3Eyn/
Uwaga: Napisałem tę odpowiedź, żeby pokazać, że jest możliwe, aby odziedziczyć stan prywatny w JavaScript. Jednak radziłbym nie używać tego wzoru. Jeśli dobrze zaprojektujesz swój kod, nie będziesz musiał w pierwszej kolejności dziedziczyć stanu prywatnego.
Co to jest 'funkcja Dog = (function() {})()'? – Amberlamps
'private' członkowie są widoczni _only_ wewnątrz klasy, gdzie są zdefiniowani w _any_ języku, który obsługuje OOP. Nie dostaję tego, co próbujesz zrobić. – Leri
Generalnie nie, ale twoja "prywatna funkcja" jest łatwo dostępna poprzez 'notSoPrivateSaySize = new Dog().publicSaySize(); ' – Bergi