javascript建立對象的一些方式

經過建立一個Object實例

複製代碼
 var person = new Object();
 person.name = "zhouquan";
 person.age = 21;
 person.sayName = function(){
   console.log(this.name);
 };
 
 person.sayName();//zhouquan
複製代碼

對象字面量方式

複製代碼
var person = {
  name: "zhouquan",
  age: 21,
  sayName:function(){
    console.log(this.name);
  }
};

person.sayName();//zhouquan
複製代碼

經過普通的建立object實例的方式和對象字面量的方式建立對象的方式的缺點在於:這兩種方式都不適合屢次建立同一類型的對象。函數

工廠模式

複製代碼
 function createPerson(name, age, job){
   var o = new Object();
   o.name = name;
   o.age = age;
   o.job = job;
   o.sayName = function(){
    console.log(this.name);
   };
   return o;
 }
 
 var person1 = createPerson("zhouquan", 22, "student");
 person1.sayName();  //zhouquan    
 
 var person2 = createPerson("zhouquan2", 23, "Programer");
 person2.sayName();  //zhouquan2
複製代碼

函數createPerson()可以根據接受的參數來構建一個包含全部必要信息的Person對象。能夠無數次的調用這個函數,而每次都會返回一個包含數個屬性的和一個方法的對象。工廠模式雖然解決的建立多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。this

構造函數模式

複製代碼
function Person(name, age){
  this.name = name;
  this.age = age;
  this.sayName = function(){
    console.log(this.name);
  };
}


var person1 = new Person("zhouquan", 21);
person1.sayName();  //zhouquan
var person2 = new Person("zhouquan2", 23);
person2.sayName();  //zhouquan2
複製代碼

用這種方式建立對象更工廠模式比起來具備如下幾點區別:spa

  • 沒有顯示的建立對象
  • 直接將屬性和方法賦給了this對象
  • 沒有return語句

此外,還應該注意到函數名Person使用的大寫字母P。這個是爲了區別於其餘的函數。prototype

原型模式

複製代碼
function Person(){
}
Person.prototype.name = "zhouquan";
Person.prototype.age = 21;
Person.prototype.sayName = function(){
  console.log(this.name);
};

var person1 = new Person();
person1.sayName();//zhouquan

var person2 = new Person();
person2.sayName();//zhouquan
複製代碼

prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含能夠有特定類型的全部實例共享的屬性和方法。使用原型對象的好處也就是可讓全部的對象實例共享它所包含的屬性和方法。指針

可是這種方法寫起來仍是不方便,須要在每個屬性或者方法前面書寫Person.prototype,我能夠結合前面的對象字面量的方法來進行改進:code

複製代碼
function Person(){
}
Person.prototype={
  name : "zhouquan",
  age : 21,
  sayName : function(){
    console.log(this.name);
  }
};

var person1 = new Person();
person1.sayName();//zhouquan

var person2 = new Person();
person2.sayName();//zhouquan
複製代碼

組合使用構造函數模式和原型模式

複製代碼
function Person(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype={
  sayName : function(){
    console.log(this.name);
  }
};

var person1 = new Person("zhouquan", 21);
person1.sayName();//zhouquan

var person2 = new Person("xiaozhou", 21);
person2.sayName();//xiaozhou
複製代碼

這種方式是建立自定義類型的最多見方式。構造函數模式用於定義實例屬性,而原型模式用於定義方法和共享的屬性。這樣,每一個實例都會有本身的一份實例屬性的副本,但同時又共享這對方法的引用,最大限度地節省了內存。另外,這種組合模式還支持向構造函數傳遞參數。能夠說,這是用來定義引用類型的一中默認模式。對象

動態原型模式

複製代碼
function Person(name, age){
  this.name = name;
  this.age = age;
  if(typeof this.sayName != "function"){
    Person.prototype.sayName = function(){
      console.log(this.name);
    };
  }
}

var person1 = new Person("zhouquan", 21);
person1.sayName();//zhouquan

var person2 = new Person("xiaozhou", 21);
person2.sayName();//xiaozhou
複製代碼

這裏只在sayName()方法不存在的狀況下,纔會將它添加到原型中,if語句只在初次調用函數時纔會執行。其中if語句檢查的能夠是初始化以後應該存在的任何屬性或方法,沒必要用一大堆if語句檢查每一個屬性和方法,只要檢查一個便可。須要注意的是,使用動態原型模式時,不能使用對象字面量重寫原型,由於若是在以及建立了實例的狀況下重寫原型,那麼就會切斷現有實例與新原型之間的聯繫。blog

相關文章
相關標籤/搜索