0
Я хотел реализовать тип узла, как описано ниже, но я хочу скрыть или защитить свойства, которые не являются функциями, поэтому они не могут быть написаны извне класса. Возможно ли, что Mootools скрывает и защищает свойства? и в чем разница между шкурой и защитой в Mootools?mootools, реализующий класс Node со скрытыми и защищенными свойствами
var Node = new Class({
initialize : function(name){
this.globalId = container.globalId++;
this.name = name || 'unnamed Node';
},
globalId : null,
siblingId : null,
name : null,
parentNode: null,
childrenNodes : [],
addChild : function(child){
//ensure it is a Node object
if(!instanceOf(child,Node)){
throw new Exception('Not a Node',this.name+':\nNode.globalId = '+this.globalId+
"\nAttempting to add a child node that is not a 'Node' type!");
}
child.parentNode = this;
child.siblingId = this.children.length;
this.children.push(child);
},
removeChild : function(child){
//ensure the child is my child!
if(child.parentNode !== this){
throw new Exception('Lost Child',this.name+':\nNode.globalId = '+this.globalId+
"\nAttempting to remove Node:\n"+child.name+":\nNode.globalId = "+child.globalId);
}
this.childrenNodes.splice(child.siblingId,1);
}
});
Node.globalId = 0;
спасибо, я знаю, как сделать переменное частное использование затворов, как это, я был просто интересно, есть ли у Mootools метод в API для этого в определении класса. Я видел, что у них есть функции Function.prototype.hide() и Function.prototype.protect(), которые меняют переменную $ hidden и $ protected на true, но я не был уверен, как их использовать. – 0xor1
нет действительно. использование замыкания является единственным приемлемым шаблоном для наличия частных переменных. вы можете подвергнуть некоторых аксессуаров из определения вашего класса, которые либо читают, либо записывают в переменную, но нет способа защитить любое свойство, возвращаемое конструктором класса - все, что он делает, это дать вам специально созданный объект с обернутыми методами (когда функции). он не может обернуть свойства статического объекта. 'Node.globalId = 0;' также просто использует объект для хранения - вы хотите рассмотреть 'Node.prototype.globalId' или' NodeInstance.globalId'. –
, если у вас есть '__defineGetter__' и' __defineSetter__', доступные в вашем браузере, вы можете сделать такие вещи, чтобы защитить себя: http://jsfiddle.net/dimitar/uuxSX/ –