function A(name){
this.a = name;
this.display=function(){ alert(this.a);}
}A.PI = 3.14;
A.meth1 = function(){ alert('test');}A.prototype.pi = 24.5;
A.prototype.meth2 = function(){alert('prototype')}这三种类型的变量和方法有什么不同哟,

解决方案 »

  1.   

    // 定义实例属性和实例方法,即每个实例会对立保留一份副本,
    // 因此不建议创建实例方法,可用原型方法替代,即第三种方式。
    // 建议只在类定义中定义实例属性。
    function A(name){ 
    this.a = name; 
    this.display=function(){ alert(this.a);} 
    } // 定义静态属性和静态方法,与实例无关,仅此一份!
    A.PI = 3.14; 
    A.meth1 = function(){ alert('test');} // 定义原型属性和原型方法,每个实例共享一个原型,
    // 因此不建议创建原型属性,可用静态属性替代。
    // 建议只在原型上扩展原型方法。
    A.prototype.pi = 24.5; 
    A.prototype.meth2 = function(){alert('prototype')} 现在很流行 JSON 定义方式,不过俺还是偏好标准的 function 定义及 prototype 扩展方式!
    理由很简单,JSON 的方式缩进层级较多,代码的易读性不好!
      

  2.   

    "A.PI = 3.14;
    A.meth1 = function(){ alert('test');} "
    相当于 static 变量或方法。属于A类。
    “this.a = name;
    this.display=function(){ alert(this.a);} ”和“A.prototype.pi = 24.5;
    A.prototype.meth2 = function(){alert('prototype')} ”
    两个基本相同。为成员变量或方法,属于A的实例。
      

  3.   

    补充一句,定义的形式要以易读、易维护为准,但这是因人而异的!类定义的关键在于,对于属性和方法的设计,设计准则就是 Simple and Clean,直译就是简单明了,意义就是“大道至简”!
      

  4.   

    注意,this.a = name 与 A.prototype.pi = 24.5 是完全不同滴,this.a = name 是定义实例属性,每个实例一个属性,互不干扰;A.prototype.pi = 24.5 是定义原型属性,
    当没有实例单独设置 pi 属性时,即只有对 pi 的读取时,
    A.prototype.pi 与静态属性无异,
    当有个别实例单独设置 pi 属性时,其实是为实例添加了动态属性 pi,而隐藏了原型属性 pi,
    但原型属性 pi 不会被修改!
    这里涉及原型链的查找,即从当前实例开始,逐层向上检索同名属性或方法!