javascript對象建立方式

工廠模式

在ECMAscript中沒法建立類,因此開發人員就發明了一種函數,用函數來封裝,以特定接口建立對象的細節,以下面的例子所示:
function createPerson(name,age,job){
  var temp=new Object();
  temp.name=name;
  temp.age=age;
  temp.job=job;
  temp.sayName=function(){
    alert(this.name);
  }
  return temp;

}
var person1=createPerson("Nick",20,"student");
var person2=createPerson("Lucy",24,"Doctor");
person1.sayName();//Nick
person2.sayName();//Lucy
person1==person2;//false
函數CreatePerson可以根據接受的參數來構建一個Person對象.咱們能夠無數次的調用這個函數,而每次它返回一個包括三個屬性一個方法的對象.

構造函數模式

ECMAScript中的構造函數可用來建立特定類型的對象.咱們能夠建立自定義的構造函數,從而定義自定義對象對象類型的屬性和方法,以下面的例子所示:
function Person(name,age,job){
  this.name=name;
  this.age=age;
  this.job=job;
  this.sayName=function(){
   alert(this.name);
  };
}
var person1=new Person("Nick",20,"Student");
var person2=new Person("Lucy",22,"Doctor");
person1.sayName();//Nick
person2.sayName();//Lucy
person1==person2;//false

我麼能夠看到,Person()中的代碼並無顯示地建立對象,而是直接將屬性和方法賦給了this對象.要建立Person的實例,必須使用new操做符,以調用構造函數的方式建立對象實際上經歷如下4個步驟:
  1. 建立一個新對象;
  2. 將構造函數的做用域賦給新對象(此時this就指向了這個新對象);
  3. 執行構造函數裏面的代碼(爲這個新對象添加屬性和方法);
  4. 返回新對象
在上面的代碼中能夠看到,person1和person2分別保存着Person的不一樣實例,這兩個對象都有一個constructor(構造函數)屬性,該屬性指向Person,以下面所示:
person1.constructor==Person;//true
person2.constructor==Person;//true

原型模式

咱們建立的每一個函數都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含能夠由特定類型的全部實例共享的屬性和方法.使用原型對象的好處是能夠讓全部對象實例共享它所包含的屬性和方法.換句話說,沒必要在構造函數中定義對象實例的信息,而是能夠將這些信息直接添加到原型對象當中,以下面的例子所示:
"use strict"//執行嚴格模式
function Person(){

}
Person.prototype.name="Nick";
Person.prototype.age="24";
Person.prototype.job="student";
Person.prototype.sayName=function(){
 alert(this.name);
}
var person1=new Person();
var person2=new Person();
person1.sayName();//Nick
person2.sayName();//Nick
person1==person2;//false
person1.sayName==person2.sayName;//true

咱們將sayName()方法和全部屬性都直接添加到了Person的prototype屬性中,構造函數變成了空函數.但與構造函數模式不一樣的是,新對象的這些屬性和方法是由全部實例共享的.換句話說,person1和person2訪問的都是同一組屬性和同一個sayName()函數.
相關文章
相關標籤/搜索