欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript面向?qū)ο笤O(shè)計(jì)二 構(gòu)造函數(shù)模式

 更新時(shí)間:2011年12月20日 01:23:05   作者:  
在Javascript面向?qū)ο笤O(shè)計(jì)一——工廠模式 中介紹了使用CreateEmployee()函數(shù)創(chuàng)建員工類。ECMAScript中的構(gòu)造函數(shù)可以用來創(chuàng)建特定類型的對(duì)象,如Object和Array這樣的原生構(gòu)造函數(shù),在運(yùn)行時(shí)會(huì)自動(dòng)出現(xiàn)在執(zhí)行環(huán)境中,此外也可以創(chuàng)建自定義的構(gòu)造函數(shù),從而創(chuàng)建自定義對(duì)象類型的屬性和方法
我們將使用構(gòu)造函數(shù)模式將工廠模式進(jìn)行改寫。
復(fù)制代碼 代碼如下:

function Employee(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function () {
alert(this.name);
};
}
var Jim = new Employee("jim", 22, "SoftWare Engineer");
var Sun = new Employee("Sun", 24, "Doctor");
Jim.sayName();
Sun.sayName();

在以上代碼中Employee函數(shù)取代了CreateEmployee函數(shù),Employee中的代碼與CreateEmployee中的代碼不同如下:
沒有顯示的創(chuàng)建對(duì)象
直接將屬性和方法賦給了this對(duì)象
沒有return語句
要?jiǎng)?chuàng)建Employee類的新實(shí)例,必須使用new操作符,實(shí)際會(huì)經(jīng)歷四個(gè)步驟:
創(chuàng)建一個(gè)新對(duì)象
將構(gòu)造函數(shù)的作用域賦給新的對(duì)象
執(zhí)行構(gòu)造函數(shù)中代碼
返回新對(duì)象
以上代碼最后Jim和Sun中分別保存著Employee的兩個(gè)不同實(shí)例,這兩個(gè)實(shí)例都有一個(gè)constructor(構(gòu)造函數(shù))屬性,該屬性指向Employee,可以做如下測(cè)試
復(fù)制代碼 代碼如下:

alert(Jim instanceof Employee); //true
alert(Sun instanceof Employee);//true

同時(shí)這兩個(gè)對(duì)象又都是Object類型的,可通過如下代碼檢測(cè)。
復(fù)制代碼 代碼如下:

alert(Jim instanceof Object); //true
alert(Sun instanceof Object);//true

創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來可以把它的實(shí)例標(biāo)石為一種特定的類型,而這也正是構(gòu)造函數(shù)模式勝過工廠模式的地方。
下面詳細(xì)講解一下構(gòu)造函數(shù):
將構(gòu)造函數(shù)當(dāng)做函數(shù)
構(gòu)造函數(shù)與其他函數(shù)的唯一區(qū)別就在于調(diào)用它們的方式不同。但是構(gòu)造函數(shù)也是函數(shù),不存在定義構(gòu)造函數(shù)的特殊語法。其實(shí),任何函數(shù),只有通過new來調(diào)用,那他就可以作為構(gòu)造函數(shù),例如,Employee除了以上用new方法調(diào)用外,還可以用如下方式來調(diào)用。
復(fù)制代碼 代碼如下:

//作為普通函數(shù)調(diào)用
Employee("Sun", 28, "SoftWare Engineer"); //添加到window中
window.sayName();//Sun

復(fù)制代碼 代碼如下:
//在另一個(gè)對(duì)象的作用域中調(diào)用
var o = new Object();
Employee.call(o, "Sun", 28, "SoftWare Engineer");
o.sayName();//Sum

構(gòu)造函數(shù)的問題
使用構(gòu)造函數(shù)的主要問題就是都要在每個(gè)實(shí)力上重新創(chuàng)建一遍,以上兩個(gè)對(duì)象中的sayName方法其實(shí)是不同的Function的實(shí)例,可以用如下方法證明:
alert(Jim.sayName == Sun.sayName);//false
但是創(chuàng)建兩個(gè)完成同樣任務(wù)的Function實(shí)例,所以我們對(duì)上面的函數(shù)進(jìn)行改寫,如下
復(fù)制代碼 代碼如下:

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

這樣就解決了兩個(gè)函數(shù)做同一件事情的問題,但是新的問題又會(huì)出現(xiàn)了,這個(gè)在全局作用域中定義的函數(shù),實(shí)際上只能被某個(gè)對(duì)象引用,而且最要命的問題是,如果對(duì)象需要定義很多方法,那么就需要定義很多個(gè)全局函數(shù),所以這個(gè)自定義的引用類型,就沒有任何封裝性可言了.

相關(guān)文章

最新評(píng)論