Во-первых, вы действительно не потеряете эффект прототипирования при использовании шаблона функционального наследования.Я просто предполагаю, что вы говорите о хороших частях , Крокфорд также представил довольно простой и эффективный способ иметь общих переменных для этого шаблона.Что в основном выглядит следующим образом:
var Human = (function(my, priv) {
var my = my || {},
priv = priv || {};
my.privatedata = "foobar";
priv.walk = function() {
console.log('walking');
return priv;
};
priv.talk = function() {
console.log('blah blah');
return priv;
};
return priv;
}());
var Andy = (function(my, priv) {
var my = my || {},
priv = Human(my, priv);
priv.SpecialAndyThing = function() {
console.log('bloggin at typeofnan.com');
return priv;
};
return priv;
}());
var myAndy = Andy();
myAndy.talk().SpecialAndyThing();
Вы можете даже просто расширить эту технику, чтобы иметь некоторые методы super .Использование загадочных соглашений о переменных, таких как подчеркивание или что-то еще, является плохой практикой в целом.Это сбивает с толку, поскольку никто просто не знает, что там происходит (возможно, этот аргумент не сработает, если вы единственный, кто использует кодовую базу).
Тем не менее, в ECMAscript Edition 5 есть некоторые полезные свойства, чтобы иметь больше "приватности""члены цепочки прототипов .Одним из важных методов для этого является .defineProperty
, где вы можете определить свойство, которое не «поверхностно» до конца.Будет выглядеть так:
var Human = {};
Object.defineProperty(Human, 'privateStuff', {
value: 'secret',
enumerable: false
});
Теперь свойство privateStuff
не отображается для объекта, который наследуется от цепочки прототипов Human
.В любом случае, для этого требуется Javascript 1.8.5, и пока он доступен только в самых современных браузерах.См https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty