2012-06-17 2 views
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; 

ответ

1

Если вам нужно скрытые свойства, вы можете получить их, как это:

var Node = (function() { 
    var someProperty; // This variable and any others you create here are available only inside this function's scope 

    return new Class({ 
     // You have access to those variables here 
    }); 
}()); // call the function immediately. It returns your new class. 
+0

спасибо, я знаю, как сделать переменное частное использование затворов, как это, я был просто интересно, есть ли у Mootools метод в API для этого в определении класса. Я видел, что у них есть функции Function.prototype.hide() и Function.prototype.protect(), которые меняют переменную $ hidden и $ protected на true, но я не был уверен, как их использовать. – 0xor1

+0

нет действительно. использование замыкания является единственным приемлемым шаблоном для наличия частных переменных. вы можете подвергнуть некоторых аксессуаров из определения вашего класса, которые либо читают, либо записывают в переменную, но нет способа защитить любое свойство, возвращаемое конструктором класса - все, что он делает, это дать вам специально созданный объект с обернутыми методами (когда функции). он не может обернуть свойства статического объекта. 'Node.globalId = 0;' также просто использует объект для хранения - вы хотите рассмотреть 'Node.prototype.globalId' или' NodeInstance.globalId'. –

+0

, если у вас есть '__defineGetter__' и' __defineSetter__', доступные в вашем браузере, вы можете сделать такие вещи, чтобы защитить себя: http://jsfiddle.net/dimitar/uuxSX/ –

Смежные вопросы