JavaScript學習筆記之創建對象

        一、創建自定義對象最簡單的方式就是創建一個object實例,然後爲它添加屬性和方法。

var person=new Object();
person.name="John";
person.age=20;
person.sayName=function(){
       alert(this.name);
};
        

        二、通過對象字面量進行定義。

var person={
      name:"John",
      age:20,
      sayName:function(){
            alert(this.name);
      }
};

        三、工廠模式

function createPerson(name,age){
      var o=new Object();
      o.name=name;
      o.age=age;
      o.sayName=function(){
            alert(this.name);
      };
      return o;
}

var person1=createPerson("John",20);
var person2=createPerson("Mike",25);
       優點:解決了創建 多個相似對象的問題

       缺點:無法知道一個對象實例的具體類型

        四、構造函數模式

function Person(name,age){
      this.name=name;
      this.age=age;
      this.sayName=function(){
            alert(this.name);
      };
}

var person1=new Person("John",20);
var person2=new Person("Mike",25);
        優點:較之工廠模式,可以識別對象的具體類型(instanceof)。

        缺點:每個方法都要在每個實例上重新創建一遍,每個Person實例都包含一個不同的function實例(函數的作用域鏈和標識符解析都不同),無法實現方法的共享。
        五、原型模式

function Person(){}

Person.prototype.name="John";
Person.prototype.age=20;
Person.prototype.sayName=function(){
      alert(this.name);
};

var person1=new Person();
person1.sayName();   //"John"

var person2=new Person();
person2.sayName();   //"John"

alert(person1.sayName==person2.sayName);   //true

        更簡單的原型模式

function Person(){}

Person.prototype={
      constructor:Person,
      name:"John",
      age:20,
      sayName:function(){
           alert(this.name);
     }
};
        優點:可以讓所有對象實例共享它所包含的屬性和方法。

        缺點:無法擁有獨立的引用類型屬性。沒有爲構造函數傳遞初始化參數,使得所有實例在默認情況下都取得相同的屬性值。

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

function Person(name,age){
      this.name=name;
      this.age=age;
      this.friends=["Kevin","Jason"];
}

Person.prototype={
      constructor:Person,
      sayName:function(){
            alert(this.name);
      }
};

var person1=new Person("John",20);
var person2=new Person("Mike",25);

person1.friends.push("Van");
alert(person1.friends);   //"Kevin,Jason,Van"
alert(person2.friends);   //"Kevin,Jason"
alert(person1.sayName===person2.sayName);   //true

        這是定義應用類型的一種默認模式。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章