1. 程式人生 > >建立物件(二)——三種基本模式的組合使用

建立物件(二)——三種基本模式的組合使用

一、建構函式模式和原型模式的組合使用

建立自定義型別的最常用方式

function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    this.friends=["Shelly","Court"];
}
Person.prototype={
    constructor:Person,
    sayName:function(){
    console.log(this.name);
}
};
var person1=new Person("Nicholas",29,"Software Engineer"
); var person2=new Person("Greg",21,"Doctor"); person1.friends.push("Ken"); console.log(person1.friends);//[ 'Shelly', 'Court', 'Ken' ] console.log(person2.friends);//[ 'Shelly', 'Court'] console.log(person1.friends===person2.friends);//false console.log(person1.sayName===person2.sayName);//true

注:建構函式模式用於定義例項屬性,而原型模式用於定義方法和共享的屬性。結果,每個例項都會有自己的一份例項屬性的副本,但同時又共享著對方法的引用,最大限度的節省了記憶體。可以說,這是使用最廣泛、認同度最高的一種建立自定義型別的方法,也是用來定義引用型別的一種預設模式。

二、動態原型模式

建構函式模式與原型模式結合並關聯。

通過檢查某個應該存在的方法是否有效,來決定是否需要初始化原型。如下面的例子:

function Person(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    if(typeof this.sayName!="function"){
        Person.prototype.sayName=function(){
            console.log(this.name);
        }
    }
}
var friend=
new Person("Nicholas",29,"Software Engineer"); friend.sayName();//"Nicholas"

三、寄生建構函式模式

工廠模式和建構函式模式的結合。相當於用工廠模式重寫呼叫建構函式時返回的值。

經典例子:

function SpecialArray(){
    //建立陣列
    var values=new Array();
    //新增值
    values.push.apply(values,arguments);
    // values.push(arguments);
    //新增方法
    values.toPipedString=function(){
        return this.join("|");
    }
    //返回陣列
    return values;
}
var colors=new SpecialArray("red","blue","green");
console.log(colors.toPipedString());//red|blue|green

注意:返回的物件與建構函式或者與建構函式的原型屬性之間沒有什麼關係,與在建構函式外部建立的物件沒有什麼不同。所以,不能依賴instanceof操作符來確定物件型別。

四、穩妥建構函式模式

該模式是出於安全性考慮

特點:1.新建立物件的例項方法不引用this 2.不使用new操作符呼叫建構函式

經典例子:

function Person(name,age,job){
    //建立要返回的物件
    var o=new Object();
    //定義私有變數和函式
    var name=name;
    //新增方法
    o.sayName=function(){
        console.log(name);
    };
    //返回物件
    return o;
}
var friend=Person("Nicholas",28,"Software Engineer");
friend.sayName();//Nicholas
console.log(friend.name);//undefined

變數friend中儲存的是一個穩妥物件,除了呼叫sayName()方法外,沒有別的方式可以訪問其資料成員。

注意:與寄生建構函式模式類似,穩妥建構函式模式建立的物件與建構函式之間也沒有關係,因此instanceof操作符對這種物件也沒有意義。