js建立對象的幾種模式

1.工廠模式

例子:數組

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("EvanChen",18,"Software Engineer");//建立一個對象

問題:沒有解決對象識別問題安全

alert(person1 instanceof createPerson)//fasle 會發現其實並不存在一個createPerson類

2.構造函數模式

例子:app

function Person(name,age){
        this.name = name;
        this.age = age;
        this.sayName = function(){
            alert(this.name);
        }
    }
    var p1 = new Person('EvanChen',18);//建立一個Person類

用new操做符調用構造函數經歷瞭如下4個步驟:函數

  • (1)建立一個新對象this

  • (2)將構造函數的做用域賦給新對象prototype

  • (3)執行構造函數中的代碼code

  • (4)返回新對象對象

解決了工廠模式兌現識別問題:ip

alert(typeof(p1));// Person
alert(p1 instanceof(Person));// true

3.原型模式

例子:ci

function Person(){        
    }
    Person.prototype.name = "EvanChen";
    Person.prototype.age= 18;
    Person.prototype.sayName= function(){
        alert(this.name);
    }
    
    var p1 = new Person();
    p1.sayName(); //"EvanChen"
    
    var p2 = new Person();
    p2.sayName(); //"EvanChen"
    
    alert(p1.sayName == p2.sayName); //true

將全部屬性和方法都加在Person的prototype屬性中,所以新對象具備相同的屬性和方法。

4.組合使用構造函數模式和原型模式(推薦)

例子:

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

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

var person1 = new Person("EvanChen",18);
var person2 = new Person("Greg",16);

person1.friends.push("Van");
alert(person1.friends);//"Shelby,Court,Van"
alert(person2.friends);//"Shelby,Court"
alert(person1.friends == person2.friends);//false
alert(person1.sayName == person2.sayName );//true

全部實例共享原型中的屬性constructor和方法sayName(),相同的屬性在構造函數中定義。

5.動態原型模式(推薦)

例子:

function Person(name,age){
    this.name = name;
    this.age = age;
    if (typeof this.sayName != "function"){
        Person.prototype.sayName = function(){
            alert(this.name);
        };
    }
};
var person1 = new Person("EvanChen",18);
person1.sayName();

在sayName()方法不存在的狀況下,纔會將它添加到原型中,當原型完成初始化後,可以當即在全部實例中獲得共享。

6.寄生構造函數模式

基本思想是:建立一個函數,該函數的做用僅僅是封裝對象的代碼,而後再返回新構建函數的對象
例子:

function SpecialArray(){
    var values = new Array();//建立數組
    values.push.apply(values,arguments);//添加值
    values.toPipedString = function () {
        return this.join("|");
    }//添加方法
    return values//返回數組    
}

var colors = new SpecialArray("red","blue","green");
alert(colors.toPipedString());//red|blue|green

構造函數返回的對象與構造函數外部建立的對象沒有什麼不一樣,所以不能依賴instanceof操做符來肯定對象類型。

7.穩妥構造函數模式

穩妥對象指的是沒有公共屬性,並且其方法也再也不引用this的對象。穩妥對象最適合在一些安全的環境中,或者防止數據被其餘應用程序刪改時使用。

例子:

function Person(name, age) {
    //建立要返回的對象
    var o = new Object();
    //定義私有變量和函數
    o.sayName = function (){
        alert(name);
    }
    return o;
}

var person1 = Person("EvanChen", 18);
person1.sayName();//"EvanChen"

在這種模式建立的對象中,除了使用sayName()方法外,沒有其餘方法訪問name的值。

相關文章
相關標籤/搜索