摘要:工廠模式?jīng)]有解決對(duì)象識(shí)別的問(wèn)題即怎樣知道一個(gè)對(duì)象的類(lèi)型構(gòu)造函數(shù)模式使用構(gòu)造函數(shù)的主要問(wèn)題,就是每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。創(chuàng)建要返回的對(duì)象可以在這里定義私有變量和函數(shù)添加函數(shù)注意寄生構(gòu)造函數(shù)中是返回對(duì)象注意寄生構(gòu)造函數(shù)中是
1、工廠模式
沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(即怎樣知道一個(gè)對(duì)象的類(lèi)型)
function createPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); }; return o; } var person1 = createPerson("Nicholas",29,"Software Engineer");2、構(gòu)造函數(shù)模式
使用構(gòu)造函數(shù)的主要問(wèn)題,就是每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。通過(guò)把函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部來(lái)解決這個(gè)問(wèn)題
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name); }; } var person1 = new Person("Nicholas", 29, "Software Engineer"); //把函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部 function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName(){ alert(this.name); } var person1 = new Person("Nicholas", 29, "Software Engineer");
如果對(duì)象需要定義很多方法,那么就要定義很多個(gè)全局函數(shù),于是我們這個(gè)自定義的引用類(lèi)型就絲毫沒(méi)有封裝性可言了。
3、原型模式原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法;
原型模式最大的問(wèn)題是由其共享的本性導(dǎo)致的:對(duì)于那些包含基本值的屬性可以通過(guò)在實(shí)例上添加一個(gè)同名屬性,可以隱藏原型中的對(duì)應(yīng)屬性,但是對(duì)于包含引用類(lèi)型值的屬性來(lái)說(shuō),問(wèn)題就很突出了。
function Person(){ } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName();4、組合使用構(gòu)造函數(shù)模式和原型模式
創(chuàng)建自定義類(lèi)型的最常見(jiàn)方式就是組合使用構(gòu)造函數(shù)模式與原型模式;
構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享的屬性。
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.friends = ["Shelby", "Court"]; } Person.prototype = { constructor : Person, sayName : function() { alert(this.name); } } var person1 = new Person("Nicholas",29,"Software Engineer");5、動(dòng)態(tài)原型模式
通過(guò)檢查某個(gè)應(yīng)該存在的方法是否有效來(lái)決定是否需要初始化原型;
注意:使用動(dòng)態(tài)原型模式時(shí),不能使用對(duì)象字面量重寫(xiě)原型。如果在已經(jīng)創(chuàng)建了實(shí)例的情況下重寫(xiě)原型,那么就會(huì)切斷現(xiàn)有實(shí)例與新原型之間的聯(lián)系;
function Person(name, age, job) { this.name = name; this.aghe = age; this.job = job; if(typeof this.sayName !="function") { Person.prototype.sayName = function(){ alert(this.name); }; } } var friend = new Person("Nicholas",29,"Software Engineer");6、寄生構(gòu)造函數(shù)模式
封裝創(chuàng)建對(duì)象的代碼,然后再返回新創(chuàng)建的對(duì)象;
除了使用new操作符并把使用的包裝函數(shù)叫做構(gòu)造函數(shù)之外,這個(gè)模式和工廠模式其實(shí)是一模一樣的
function Person (name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); }; return o; } var friend = new Person("Nicholas", 29, "Software Engineer");7、穩(wěn)妥構(gòu)造函數(shù)模式
穩(wěn)妥構(gòu)造函數(shù)遵循與寄生構(gòu)造函數(shù)類(lèi)似的模式,但有兩點(diǎn)不同:
(1)新創(chuàng)建對(duì)象的實(shí)例方法不引用this;
(2)不使用new操作符調(diào)用構(gòu)造函數(shù)。
function Person(name, age, job) { var o = new Object(); //創(chuàng)建要返回的對(duì)象 //可以在這里定義私有變量和函數(shù) o.name = name; o.age = age; o.job= job; //添加函數(shù) o.sayName = function() { alert(name); //注意寄生構(gòu)造函數(shù)中是alert(this.name) }; //返回對(duì)象 return o; } //注意寄生構(gòu)造函數(shù)中是var friend = newPerson("Nicholas", 29, "Software Engineer"); var friend = Person("Nicholas", 29, "Software Engineer"); friend.sayName(); //"Nicholas"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105958.html
摘要:使用最多的繼承模式是組合繼承,這種模式使用原型鏈繼承共享的屬性和方法,而借用構(gòu)造函數(shù)繼承實(shí)例屬性。原型式繼承,可以在不必預(yù)先定義構(gòu)造函數(shù)的情況下實(shí)現(xiàn)繼承,其本質(zhì)是執(zhí)行給定對(duì)象的淺復(fù)制。 1、原型鏈實(shí)現(xiàn)繼承 function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = func...
摘要:遞歸閉包模仿塊級(jí)作用域私有變量小結(jié)在編程中,使用函數(shù)表達(dá)式可以無(wú)需對(duì)函數(shù)命名,從而實(shí)現(xiàn)動(dòng)態(tài)編程。匿名函數(shù)也稱(chēng)為拉姆達(dá)函數(shù)。函數(shù)聲明要求有名字,但函數(shù)表達(dá)式不需要。中的函數(shù)表達(dá)式和閉包都是極其有用的特性,利用它們可以實(shí)現(xiàn)很多功能。 1、遞歸 2、閉包 3、模仿塊級(jí)作用域 4、私有變量 5、小結(jié) 在JavaScript編程中,使用函數(shù)表達(dá)式可以無(wú)需對(duì)函數(shù)命名,從而實(shí)現(xiàn)動(dòng)態(tài)編程。匿名函數(shù)也稱(chēng)...
摘要:字符串大小寫(xiě)轉(zhuǎn)換方法和則是針對(duì)特定地區(qū)的實(shí)現(xiàn)??梢曰谥付ǖ姆指舴麑⒁粋€(gè)字符串分割成多個(gè)子字符串,并將結(jié)果放在一個(gè)數(shù)組中將字符串轉(zhuǎn)換為數(shù)組。分隔符可以是字符串,也可以是一個(gè)對(duì)象。 1、對(duì)象創(chuàng)建 String類(lèi)型是字符串的對(duì)象包裝類(lèi)型,可以像下面這樣使用String構(gòu)造函數(shù)來(lái)創(chuàng)建。 var stringObject = new String(hello world); String對(duì)象...
摘要:除此之外,在超類(lèi)型的原型中定義的方法,對(duì)子類(lèi)型而言也是不可兼得,結(jié)果所有類(lèi)型都只能用構(gòu)造函數(shù)模式。創(chuàng)建對(duì)象增強(qiáng)對(duì)象指定對(duì)象繼承屬性這個(gè)例子的高效率體現(xiàn)在它只調(diào)用了一次構(gòu)造函數(shù)。 1、原型鏈 原型鏈的基本思想是利用原型讓一個(gè)引用類(lèi)型繼承另一個(gè)引用類(lèi)型的屬性和方法。構(gòu)造函數(shù)、原型和實(shí)例的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象;原型對(duì)象都包含著一個(gè)指向構(gòu)造函數(shù)的指針;實(shí)例都包含一個(gè)指向原型對(duì)象的...
摘要:于是我就先把這本薄的經(jīng)典書(shū)語(yǔ)言精粹修訂版豆瓣讀書(shū)本書(shū)簡(jiǎn)介總共章,除去附錄,才頁(yè),讀完并記錄了一些筆記。讀書(shū)筆記還可以分享給別人看。編程語(yǔ)言第版定義了的標(biāo)準(zhǔn)。程序檢查時(shí)丟棄值為函數(shù)的屬性。 之前看到這篇文章,前端網(wǎng)老姚淺談:怎么學(xué)JavaScript?,說(shuō)到怎么學(xué)習(xí)JavaScript,那就是看書(shū)、分析源碼。10本書(shū)讀2遍的好處,應(yīng)該大于一本書(shū)讀20遍。看書(shū)主動(dòng)學(xué)習(xí),看視頻是被動(dòng)學(xué)習(xí)。看...
閱讀 1118·2021-11-23 09:51
閱讀 1082·2021-10-18 13:31
閱讀 2991·2021-09-22 16:06
閱讀 4284·2021-09-10 11:19
閱讀 2207·2019-08-29 17:04
閱讀 437·2019-08-29 10:55
閱讀 2485·2019-08-26 16:37
閱讀 3381·2019-08-26 13:29