使用Javascript继承 private 变量并使用 compact 获取和设置技术

分享于 

9分钟阅读

Web开发

  繁體 雙語




Introduction



( 请耐心等待,我写了文章。 请耐心点 !

当我们研究从JavaScript编程到最佳技术的机会时,我们发现了几个 troubleshotings。 这是 co

http://www.codeproject.com/aspnet/JsOOP1.asp
http://www.codeproject.com/aspnet/JsOOP2.asp

命名空间中的命名空间。





var Article </CODE>= {};



好的,beginin创建类库的。 这个类将实现Getter和Setter技术。 注意 wath _ ( 对于我们来说,private 属性容器 ) 将被继承为目标类。 当我们从一个类中inherite时,我们希望属性会被继承。





 


/**


 * Class Base


 */


Article.Base = function()


{


 // Private Attribute Container</CODE>


 var <CODE>_</CODE> = {};


 




之后构造 private 方法( _getAttributes ),protected,并且只能调用:
  • HasProperty ( 用于证明属性存在的 public 方法)
  • 构造继承的GetProperties ( 非静态方法)
  • 添加( 为自定义类 )


如果程序员尝试使用的方法将引发异常,则 getAttributes getAttributes的方法将不有效。 最后一个特性可以从修复代码中获益。





 



 /**


 * Get Attributes from Class


 */


 this._getAttributes = function()


 {


 switch( this._getAttributes.caller ) 


 {


 case this.HasProperty:


 case this.Add:


 case Article.Extends:


 return _; /* return the attributes */


 break;


 default:


 throw "Invalid Method Caller" + "n" + this._getAttributes.caller;


 }


 }



 



这里 public 方法( 向构造函数 添加 protected ),验证是否从属性中存在。


 /**


 * Verify if exist the property


 * @parameter property {string} Name from Property


 */


 this.HasProperty = function( property </CODE></CODE></CODE></CODE></CODE></CODE></CODE>)


 {


 return ( property in this._getAttributes() );


 }



内部方法镑 。_get 只从 public 方法中调用获取。 封装这里方法时,属性为 protected,类继承自类基,可以重写 public 以获取


 <BR> /**


 * Get value from property


 *


 * @parameter string Name from property


 * @return {Object} Value from property


 */


 this._get = function( property )


 { 


 var caller </CODE>= this._get.caller;


 if( caller</CODE> != this.Get ) throw "Invalid Method Caller" + "n" + caller;


 if(!this.HasProperty(property) ) throw "Property Undefined" + " ->" + property + ": n" + caller;


 return _[property];


 }


 



_get的情况相同,_set方法是 protected,而且只有 public Set。 对于其他类,public 集可以覆盖从基继承的其他类。 注意,如果违反规则,该方法将引发异常。


<BR> /**


 * Set new value for property


 *


 * @parameter {string} Name from property


 * @value {object} The new value from property


 * @return {nothing}


 */


 this._set = function( property, value )


 {


 var caller </CODE>= this._get.caller; // who is caller


 if( caller</CODE>!= this.Set ) throw "Invalid Method Caller" + "n" + caller;


 if(!this.HasProperty(property) ) throw "Property Undefined" + " ->" + property + " n" + caller; 



 _[property] = value;


 } 



}




其他来自 public 方法的方法。 除了 _get _set obvious obvious,所有其他类都可以重写( methods and obvious

关于 public 获取方法





/**


 * It allows the use of the protected method _get


 * parameter {string} Name from Property






 */


Article.Base.prototype.Get = function( property )


{


 return this._get( property );


}



关于 public 方法




/**


 * It allows the use of the protected method _set


 * parameter {string} Name from Property


 * parameter {object} value New value for the Property



 */


Article.Base.prototype.Set = function( property, value )


{


 this._set( property, value );


}



Article.Extends

重要的static 方法。这里操作从基类继承。 在目标类中复制容器的内部属性。 ( 解释,耐心,我用英语写。)。 )

 <BR>/** 


* Create inhertis from Class Base and Other Class 


*/ 


Article.Extends = function()


{ 


 var obj = arguments[0];


 var caller = Article.Extends.caller;


 if( typeof(obj)!= "object" ) throw "Hieretic Target Undefined";


 /*


 * The reference this is important, how minimal argument 


 * Inherits from Parent class


 * Clone de prototype attributes from Parent Clas


 * Set prototype attributes again (override de properties)


 * always return attributes, that is important


 * 


 */


 switch( arguments.length )


 { 


 case 0:


 throw "Error, target reference is necessary.";


 break;


 case 1:


 arguments[1] = Article.Base; 


 case 2:


 var parentClass = arguments[1];


 parentClass.apply( obj, new Array() );


 for( var x in parentClass.prototype ) obj[x] = parentClass.prototype[x];


 for( var x in caller.prototype ) obj[x] = caller.prototype[x]; 


 return obj._getAttributes();


 break; 


 } 


}



示例:

基类中的简单 inhertis。 查看属性容器,即 protected。


 <BR>function TestClass()


{


 /*  Inherits from Base Class */


 var Attributes </CODE>= Article.Extends( this ); 


 <CODE>Attributes</CODE>.Id = "123456";


 <CODE>Attributes</CODE>.Name = "Hello World";


}



TestClass.prototype.Get = function ( <CODE>property </CODE>)


{


 return this._get(<CODE>property</CODE>) + " modifiqued";


}



var myTestClass = new TestClass();


var name = myTestClass.Get( "Name" );


<CODE>alert</CODE>( name );



TestClass的简单 inhertis。 查看属性容器,即 protected。 获取属性重载。


<BR> function TestClassReady()


{


 var Attributes </CODE>= Article.Extends( this );


 <CODE>Attributes </CODE>= Article.Extends( this, TestClass );


 <CODE>Attributes</CODE>.Ready = true;


}



TestClassReady.prototype.Get = function ( property )


{


 return this._get(property) + " ready";


}



var myTestClassReady = new TestClassReady();



var name = myTestClassReady.Get( "Name" );


<CODE>alert</CODE>( name );



var ready = myTestClassReady.Get( "Ready" );


<CODE>alert</CODE>( ready );





稍后解释我的错误英语- ( )

( 请耐心等待我写文章。 请耐心点 !


COM  JAVA  Javascript  SET  VAR  私有  
相关文章