May 15

javascript---类的构建 不指定

chirs , 15:57 , 歪布天地 » JAVASCRIPT , 评论(0) , 引用(0) , 阅读(2508) , Via 本站原创 | |
javascript里构建类主要有4种方式
1.构造方式定义类
2.原型方式定义类
3.构造和原型结合方式创建类
4.动态的原型方式

各有优缺点,具体如下
1.构造方式定义类,优点:多个实例对象不共享类的属性值,缺点:每个实例对象都会产生出一个函数say

//构造方式定义类,优点:多个实例对象不共享类的属性值,缺点:每个实例对象都会产生出一个函数say  
function User(){  
    this.username = "zhangsan";//this.不能丢  
      
    this.say = function(){//this.不能丢  
        alert("username:" + this.username );//this.不能丢  
    }  
    //下面注释的这种写法不对  
//  function say(){  
//      alert("username:" + this.username );  
//  }  
}  
  
var user = new User();  
user.username = "lisi";  
user.say();//username:lisi  
  
var user1 = new User();  
user1.say();//username:zhangsan,不受user对象的影响  

//构造方式定义类,优点:多个实例对象不共享类的属性值,缺点:每个实例对象都会产生出一个函数say
function User(){
  this.username = "zhangsan";//this.不能丢
  
  this.say = function(){//this.不能丢
    alert("username:" + this.username );//this.不能丢
  }
  //下面注释的这种写法不对
//  function say(){
//    alert("username:" + this.username );
//  }
}

var user = new User();
user.username = "lisi";
user.say();//username:lisi

var user1 = new User();
user1.say();//username:zhangsan,不受user对象的影响



//多个实例对象不共享类的属性值:
//多个实例对象不共享类的属性值,如下:  
function User(){  
    this.username = new Array();//this.不能丢  
      
    this.say = function(){//this.不能丢  
        alert("username:" + this.username );//this.不能丢  
    }  
}  
  
var user = new User();  
user.username.push("zhangsan");  
user.say();//username:zhangsan  
  
var user1 = new User();  
user1.say();//user1的username为空,不为zhangsan,因为user1的属性值不受user影响


2.原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享
//原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享  
function User(){  
}  
User.prototype.username = "zhangsan";  
User.prototype.say = function(){  
    alert("username: " + this.username );  
}  
  
var user = new User();  
user.username = "lisi";  
user.say();//username:lisi  
  
var user1 = new User();  
user1.say();//username:zhangsan  

//原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享
function User(){
}
User.prototype.username = "zhangsan";
User.prototype.say = function(){
  alert("username: " + this.username );
}

var user = new User();
user.username = "lisi";
user.say();//username:lisi

var user1 = new User();
user1.say();//username:zhangsan



类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享:
//类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享,如下  
function User(){  
}  
User.prototype.username = new Array();  
User.prototype.say = function(){  
    alert("username: " + this.username );  
}  
  
var user = new User();  
user.username.push("zhangsan") ;  
user.say();//username:zhangsan  
  
var user1 = new User();  
user1.say();//username:zhangsan,因为user1属性也会受到user的影响,user1和user指向同一引用,即共享同一属性
3.构造和原型结合方式创建类:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。
//构造和原型结合方式创建类:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。  
function User(){  
    this.username = "zhangsan";  
}  
User.prototype.say = function(){  
    alert("username: " + this.username );  
}  
var user = new User();  
alert(user.username);  


4.动态的原型方式:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的

////动态的原型方式:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的
function User(){
  this.username = "zhangsan";
  
  if(typeof User.flag == "undefined"){
    alert("execute...");
    User.prototype.say = function(){
      alert("username: " + this.username );
    }
    
    User.flag = true;
  }
}

var user1 = new User();//execute...
var user2 = new User();//不会打印出execute...,则说明方法只创建了一次,即方法只会产生一个
user1.say();//username


总结:
构造方式定义类:缺点:类里的方法,每个实例对象都会产生一个,导致产生大量方法;优点:所有实例对象都单独拥有一份类里的属性,即属性不共享
原型方法定义类:缺点:所有实例对象都共同拥有一份类里的属性,即属性共享。优点:类的方法只会产生一个,不会产生大量方法
构造和原型结合方式创建类:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。
动态的原型方式:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的
Tags: , ,
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]