Object-Oriented(一)建立對象

自用備忘筆記安全

前言函數

雖然可使用 Object 和對象字面量建立對象,可是若是要建立大量類似的對象又顯得麻煩。爲解決這個問題,人們開始使用工廠模式的變種。學習

 

工廠模式this

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

var person1 = person('Nicholas', 29),
    person2 = person('Greg', 27);

優勢:解決了建立多個類似對象的問題spa

缺點:沒有解決對象識別的問題,即不知道生成對象是什麼類型。prototype

 

構造函數模式設計

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

var person1 = new Person('Nicholas', 29),
    person2 = new Person('Greg', 27);

優勢:解決了對象識別的問題,經過對象能夠知道它是由哪一個構造函數生成的。code

person1.constructor == Person  //true
person1 instanceof Person //true
person1 instanceof Object //true

缺點:會在每一個實例對象上生成方法,沒有達到複用的效果。對象

person1.sayName == person2.sayName; //false

經過 new 操做符會經歷如下 4 個步驟:1. 建立一個新對象;2. 將構造函數的做用域賦給新對象;3. 執行構造函數中的代碼;4. 返回新對象。blog

 

原型模式

function Person() {}
Person.prototype.name = 'Nicholas';
Person.prototype.age = 29;
Person.prototype.friends = ['Shelby', Court]; Person.prototype.sayName
= function() { alert(this.name); }; var person1 = new Person();

優勢:原型對象上的屬性和方法都可以複用。

缺點:引用類型屬性被共享,沒法傳參數自定義實例對象的屬性。

var person1 = new Person(),
    person2 = new Person();

person1.friends.push('Van');

console.log(person2.friends); //Shelby, Court, Van

 

組合模式

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

var person1 = new Person('Nicholas', 29);

優勢:集合了構造函數模式和原型模式的優勢,是最普遍承認的模式。

缺點:構造函數和原型對象的初始化分開書寫,對有類概念語言的學習者不友好。

 

動態原型模式

function Person(name, age) {
    this.name = name;
    this.age = age;
    if (typeof this.sayName == 'function') return;
    Person.prototype.sayName = function() {
        alert(this.name);
    }
}

var person1 = new Person('Nicholas', 29);

優勢:將原型對象的初始化放入構造函數內部,是最理想的模式。經過檢測(任一)方法是否存在,來避免重複對原型對象初始化。

 

寄生構造函數模式

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

var person1 = new Person('Nicholas', 29);

缺點:與工廠模式類似,只是經過 new 操做符調用構造函數。與工廠模式同樣,沒法解決對象識別的問題,不推薦使用。

 

穩妥構造函數模式

穩妥對象是指沒有公共屬性,並且方法也不引用 this 的對象。

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

var person1 = Person('Nicholas', 29);

優勢:適用於禁止使用 this 和 new 的場景,安全性高,適合某些安全要求高的環節;屬性未綁定在實例對象上,只能經過特色方法訪問。

缺點:一樣沒法識別對象類型。

 

參考:《高級程序設計(第3版)》

相關文章
相關標籤/搜索