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