Javascript 創建對象方法的總結


  最近看了一下《Javascript高級程序設計(第三版)》,這本書很多人都推薦,我也再次鄭重推薦一下。看過之后總得總結一下吧,於是我選了這么一個主題分享給大家。

  使用Javascript創建對象的方法有很多,現在就來列舉一下:

  1. 使用Object構造函數來創建一個對象,下面代碼創建了一個person對象,並用兩種方式打印出了Name的屬性值。

    var person = new Object();
    person.name="kevin";
    person.age=31;
    alert(person.name);
    alert(person["name"])

  2. 使用對象字面量創建一個對象;不要奇怪person["5"],這里是合法的;另外使用這種加括號的方式字段之間是可以有空格的如person["my age"].

    var person = 
    {
        name:"Kevin",
        age:31,
        5:"Test"
    };
    alert(person.name);
    alert(person["5"]);

  3. 使用工廠模式創建對象,返回帶有屬性和方法的person對象。

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

  4. 使用自定義構造函數模式創建對象;這里注意命名規范,作為構造函數的函數首字母要大寫,以區別其它函數。這種方式有個缺陷是sayName這個方法,它的每個實例都是指向不同的函數實例,而不是同一個。

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

var person = new Person("kevin",31,"SE");
person.sayName();

  5. 使用原型模式創建對象;解決了方法4中提到的缺陷,使不同的對象的函數(如sayFriends)指向了同一個函數。但它本身也有缺陷,就是實例共享了引用類型friends,從下面的代碼執行結果可以看到,兩個實例的friends的值是一樣的,這可能不是我們所期望的。

function Person()
{

}

Person.prototype = {
    constructor : Person,
    name:"kevin",
    age:31,
    job:"SE",
    friends:["Jams","Martin"],
    sayFriends:function()
    {
        alert(this.friends);
    }
};
var person1 = new Person();
person1.friends.push("Joe");
person1.sayFriends();//Jams,Martin,Joe
var person2 = new Person(); 
person2.sayFriends();//James,Martin,Joe

  6. 組合使用原型模式和構造函數創建對象,解決了方法5中提到的缺陷,而且這也是使用最廣泛、認同度最高的創建對象的方法。

function Person(name,age,job)
{
    this.name=name;
    this.age=age;
    this.job=job;
   this.friends=["Jams","Martin"]; } Person.prototype.sayFriends
=function() { alert(this.friends); }; var person1 = new Person("kevin",31,"SE");
var person2 = new Person("Tom",30,"SE");
person1.friends.push("Joe"); person1.sayFriends();//Jams,Martin,Joe
person2.sayFriends();//Jams,Martin

 7. 動態原型模式;這個模式的好處在於看起來更像傳統的面向對象編程,具有更好的封裝性,因為在構造函數里完成了對原型創建。這也是一個推薦的創建對象的方法。

function Person(name,age,job)
{
    //屬性
    this.name=name;
    this.age=age;
    this.job=job;
    this.friends=["Jams","Martin"];
    //方法
    if(typeof this.sayName !="function")
    {
        Person.prototype.sayName=function()
        {
            alert(this.name);
        };
        
        Person.prototype.sayFriends=function()
        {
            alert(this.friends);
        };
    }
}

var person = new Person("kevin",31,"SE");
person.sayName();
person.sayFriends();

另外還有兩個創建對象的方法,寄生構造函數模式和穩妥構造函數模式。由於這兩個函數不是特別常用,這里就不給出具體代碼了。

寫了這么多創建對象的方法,其實真正推薦用的也就是方法6和方法7。當然在真正開發中要根據實際需要進行選擇,也許創建的對象根本不需要方法,也就沒必要一定要選擇它們了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM