js类的几种写法

时间:2022-08-23 16:02:19

我们常用的有以下几种方法来用JavaScript写一个“类”:

 

1. 构造函数(public属性和方法)

1: function Person(iName, iAge){ 
 2:  this.name=iName; //public
 3:  this.age=iAge; //public 
 4:  this.ShowStudent=function(){ //public
 5:  alert(this.name);
 6:  };

 7: }

 


缺点很明显,类的属性和方法,很容易被外部修改。

以上的属性和方法都是public的。下面的例子给出private和public的属性和方法。

 

 

2. 构造函数(public, private属性和方法)

 1: function Person(iName, iAge){ 
 2:  //private field 
 3:   var name = iName;    
 4:  var age = iAge;
 5:      
 6:  //private method 
 7:   var privatefn = function(){     
 8:    alert(name); 
 9:   } 
 10:  
 11:  return {
 12:     //public field 
 13:  Name: "hello " + name,
 14:  Age: "hello " + age,
 15:  
 16:  ShowStudent: function(){
 17:  privatefn(); 
 18:  alert(this.Name); 
 19:  }
 20:  };
 21: }

 

调用:(new Person("xiao","10")).ShowStudent();

 

 

3. 原型方法(prototype)

 1: function c(){}
 2: c.prototype={
 3:  name: "init value a",
 4:  setName: function(iName){
 5:  this.name=iName;
 6:  },
 7:  getName: function(){
 8:  alert('hello from c, name: ' + this.name);
 9:  }
 10: };
 11: (new c).getName(); // 输出hello from c, name: init value a

 

 

4. 构造函数+原型方法(prototype)

 1: function Person(iName) {
 2:  this.name = iName;
 3: };
 4:  
 5: Person.prototype={
 6:  getName: function(){
 7:  return this.name;
 8:  }
 9: };
 10:  
 11: //调用
 12: var b = new Person("jack");
 13: alert(b.getName()); 

一般多会用上面这种写法。

5. 构造函数+原型方法(prototype)- 节省内存的写法

 1: function Person(iName, iAge){
 2:  this.name=iName;
 3:  this.age=iAge;
 4:  
 5:  //对象实例都共享同一份方法不造成内存浪费
 6:  if(typeof Person._initialized == "undefined"){
 7:  Person.prototype.ShowStudent=function(){
 8:  alert(this.name);
 9:  };
 10:  Person._initialized=true;
 11:  }
 12: } 
 13: //调用
 14: (new Person("jack","20")).ShowStudent();

 

以上的实现方法如果不用_initialized的方法,也可以指向一个外部函数,道理一样。

 

6. JavaScript类的单例(Singleton)模式写法

 1: var MyNamespace = {};
 2: MyNamespace.Singleton = (function() {
 3:  var uniqueInstance; // Private attribute that holds the single instance.
 4:  function constructor() { // All of the normal singleton code goes here.
 5:  // Private members.
 6:  var privateAttribute1 = false;
 7:  var privateAttribute2 = [1, 2, 3];
 8:  function privateMethod1() {
 9:  //...
 10:  }
 11:  function privateMethod2(args) {
 12:  //...
 13:  }
 14:  return { // Public members.
 15:  publicAttribute1: true,
 16:  publicAttribute2: 10,
 17:  publicMethod1: function() {
 18:  // ...
 19:  },
 20:  publicMethod2: function(args) {
 21:  // ...
 22:  }
 23:  }
 24:  }
 25:  return {
 26:  getInstance: function() {
 27:  if(!uniqueInstance) { // Instantiate only if the instance doesn't exist.
 28:  uniqueInstance = constructor();
 29:  }
 30:  return uniqueInstance;
 31:  }
 32:  }
 33: })();
 34:  
 35: //调用: 
 36: MyNamespace.Singleton.getInstance().publicMethod1();