摘要:原型模式定義構(gòu)造函數(shù),在構(gòu)造函數(shù)的原型對(duì)象中定義對(duì)象的屬性和方法,并通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象。,屬性存在于實(shí)例對(duì)象中,屬性不存在于實(shí)例對(duì)象中分割線操作符會(huì)在通過(guò)對(duì)象能夠訪問(wèn)給定屬性時(shí)返回,無(wú)論該屬性是存在于實(shí)例中還是原型中。
原型模式
1.創(chuàng)建對(duì)象定義構(gòu)造函數(shù),在構(gòu)造函數(shù)的原型對(duì)象中定義對(duì)象的屬性和方法,并通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象。
function Person(){}; Person.prototype.name = "Mike"; Person.prototype.age = 20; Person.prototype.job = "student"; Person.prototype.showName = function(){ console.log("name = " + this.name); }; var p1 = new Person(); var p2 = new Person(); console.log(p1); console.log(p2);2.探究原型對(duì)象
使用原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享它包含的屬性和方法,即p1和p2訪問(wèn)的都是同一組屬性和同一個(gè)showName()函數(shù)。
但改變?cè)蛯?duì)象上的屬性時(shí),所有實(shí)例對(duì)象上對(duì)應(yīng)的屬性也同時(shí)改變。
Person.prototype.job = "teacher"; Person.prototype.showJob = function(){ console.log("job = " + this.job); }; p1.showJob(); p2.showJob(); console.log("p1.showJob === p2.showJob:"); console.log(p1.showJob === p2.showJob); console.log("-----分割線-----");
當(dāng)代碼讀取對(duì)象的某個(gè)屬性時(shí),都會(huì)執(zhí)行至少一次搜索。搜索首先從實(shí)例對(duì)象開(kāi)始,若在實(shí)例對(duì)象中搜索到了匹配的屬性,則返回該屬性的值;若無(wú),在搜索該實(shí)例對(duì)象的__proto__指針指向的原型對(duì)象,若在原型對(duì)象中搜索到了匹配的屬性,則返回該屬性的值;若無(wú),則輸出undefined。
p1.country = "China"; console.log("p1.country="); console.log(p1.country); //China console.log("p2.country="); console.log(p2.country); //Undefined console.log("-----分割線-----"); Person.prototype.country = "USA"; console.log("p1.country="); console.log(p1.country); //搜索先匹配到了實(shí)例對(duì)象p1上的country屬性,返回值為"China" console.log("p2.country="); console.log(p2.country); //第一次搜索匹配不到實(shí)例對(duì)象p2上的country屬性,執(zhí)行第二次搜索,匹配到原型對(duì)象上的country屬性,返回值為"USA" console.log("-----分割線-----");
所以,我們無(wú)法通過(guò)修改實(shí)例對(duì)象來(lái)重寫原型中的屬性。
當(dāng)為實(shí)例對(duì)象添加一個(gè)屬性時(shí),這個(gè)屬性就會(huì)屏蔽原型對(duì)象中保存的同名屬性,即便我們將其設(shè)置為null,也只會(huì)在實(shí)例中設(shè)置這個(gè)屬性,而不會(huì)恢復(fù)其指向原型的連接。不過(guò),使用delete操作符可以完全刪除實(shí)例對(duì)象的屬性。
p1.country = null; console.log("p1.country="); console.log(p1.country); //null console.log("p2.country="); console.log(p2.country); //USA console.log("-----分割線-----"); // delete操作符可以完全刪除實(shí)例屬性,從而讓我們能夠重新訪問(wèn)原型中的屬性 delete p1.country; console.log("p1.country="); console.log(p1.country); console.log("p2.country="); console.log(p2.country); console.log("-----分割線-----");
我們可以通過(guò)hasOwnProperty()方法檢測(cè)一個(gè)屬性是存在于實(shí)例中,還是原型中。這個(gè)方法只在給定屬性存在于實(shí)例對(duì)象中,才會(huì)返回true。
另外,in操作符會(huì)在通過(guò)對(duì)象能夠訪問(wèn)給定屬性時(shí)返回true,無(wú)論這個(gè)屬性是存在于實(shí)例中還是原型中。
// 先給p1實(shí)例對(duì)象定義country屬性 p1.country = "China"; // hasOwnProperty()方法可以檢測(cè)一個(gè)屬性是存在于實(shí)例中,還是存在于原型中。 // 只在給定屬性存在于對(duì)象實(shí)例中時(shí),才會(huì)返回true。 // 此方法繼承自O(shè)bject。 console.log("p1.hasOwnProperty(country):"); console.log(p1.hasOwnProperty("country")); //true,country屬性存在于實(shí)例對(duì)象p1中 console.log("p2.hasOwnProperty(country):"); console.log(p2.hasOwnProperty("country")); //false,country屬性不存在于實(shí)例對(duì)象p2中 console.log("-----分割線-----"); // in操作符會(huì)在通過(guò)對(duì)象能夠訪問(wèn)給定屬性時(shí)返回true,無(wú)論該屬性是存在于實(shí)例中還是原型中。 console.log("country in p1:"); console.log("country" in p1); //true console.log("country in p2:"); console.log("country" in p2); //true console.log("-----分割線-----");3.觀察Person構(gòu)造函數(shù)涉及到的原型鏈**
console.log("Person.prototype="); console.log(Person.prototype); console.log("Person.prototype === Function.prototype;"); console.log(Person.prototype === Function.prototype); //false console.log("-----分割線-----"); console.log("Person.prototype.constructor === Person:"); //true console.log(Person.prototype.constructor === Person); //true console.log("-----分割線-----"); console.log("Person.prototype.__proto__ === Object.prototype:"); //true console.log(Person.prototype.__proto__ === Object.prototype); //true console.log("-----分割線-----"); console.log("Person.__proto__="); console.log(Person.__proto__); console.log("Person.__proto__ === Function.prototype:"); console.log(Person.__proto__ === Function.prototype); //true console.log("-----分割線-----");4.觀察p1實(shí)例對(duì)象涉及到的原型鏈
console.log("p1.prototype="); console.log(p1.prototype); console.log("-----分割線-----"); console.log("p1.__proto__="); console.log(p1.__proto__); console.log("p1.__proto__ === Person:"); console.log(p1.__proto__ === Person); //false console.log("p1.__proto__ === Person.prototype:"); console.log(p1.__proto__ === Person.prototype); //true console.log("-----分割線-----"); console.log("p1.__proto__.constructor === Person:"); console.log(p1.__proto__.constructor === Person); console.log("-----分割線-----"); console.log("p1.__proto__.__proto__="); console.log(p1.__proto__.__proto__); console.log("p1.__proto__.__proto__ === Object.prototype:"); console.log(p1.__proto__.__proto__ === Object.prototype); //true console.log("-----分割線-----");5.觀察下p1.showName屬性引用的函數(shù)
console.log("p1.showName.prototype="); console.log(p1.showName.prototype); console.log("p1.showName.prototype === Function.prototype:"); console.log(p1.showName.prototype === Function.prototype); //false console.log("-----分割線-----"); console.log("p1.showName.prototype.constructor="); console.log(p1.showName.prototype.constructor); console.log("-----分割線-----"); console.log("p1.showName.prototype.__proto__="); console.log(p1.showName.prototype.__proto__); console.log("p1.showName.prototype.__proto__ === Object.prototype:"); console.log(p1.showName.prototype.__proto__ === Object.prototype); //true console.log("-----分割線-----"); console.log("p1.showName.__proto__="); console.log(p1.showName.__proto__); console.log("p1.showName.__proto__ === Function.prototype:"); console.log(p1.showName.__proto__ === Function.prototype); //true console.log("-----分割線-----");原型鏈圖
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/79012.html
摘要:對(duì)象是由構(gòu)造函數(shù)創(chuàng)建而成的,所以它的指向原型鏈圖對(duì)象的原型鏈圖對(duì)象屬性引用的匿名函數(shù)的原型鏈圖 Object模式 創(chuàng)建一個(gè)Object實(shí)例,再為其添加屬性和方法。 這是創(chuàng)建自定義對(duì)象最簡(jiǎn)單的方式。 1.創(chuàng)建對(duì)象 // 創(chuàng)建person對(duì)象 var person = new Object(); person.name = Mike; person.age = 20; person.jo...
摘要:組合使用構(gòu)造函數(shù)模式和原型模式構(gòu)造函數(shù)模式用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。創(chuàng)建對(duì)象組合使用構(gòu)造函數(shù)模式和原型模式指向構(gòu)造函數(shù),這里要將其恢復(fù)為指向構(gòu)造函數(shù)。另外,這種混合模式,還支持向構(gòu)造函數(shù)傳遞參數(shù)。 組合使用構(gòu)造函數(shù)模式和原型模式 構(gòu)造函數(shù)模式用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。 創(chuàng)建自定義類型的最常見(jiàn)方式,就是組合使用構(gòu)造函數(shù)模式和原型模式。 ...
摘要:工廠模式用函數(shù)來(lái)封裝,以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)。缺點(diǎn)不能知道對(duì)象識(shí)別的問(wèn)題對(duì)象的類型不知道。復(fù)雜的工廠模式定義是將其成員對(duì)象的實(shí)列化推遲到子類中,子類可以重寫父類接口方法以便創(chuàng)建的時(shí)候指定自己的對(duì)象類型。 工廠模式 用函數(shù)來(lái)封裝,以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)。 1.創(chuàng)建對(duì)象 function createPerson(name, age, job){ var o = new Obj...
摘要:創(chuàng)建對(duì)象與工廠模式的區(qū)別沒(méi)有顯示地創(chuàng)建對(duì)象直接將方法和屬性付給了對(duì)象沒(méi)有語(yǔ)句構(gòu)造函數(shù)應(yīng)該始終以一個(gè)大寫字母開(kāi)頭。創(chuàng)建構(gòu)造函數(shù)的實(shí)例,必須使用操作符。 構(gòu)造函數(shù)模式 ECMAScript中的構(gòu)造函數(shù)可用來(lái)創(chuàng)建特定類型的對(duì)象,像Object和Array這樣的原生構(gòu)造函數(shù)。也可以創(chuàng)建自定義的構(gòu)造函數(shù),從而定義自定義對(duì)象類型的屬性和方法。 1.創(chuàng)建對(duì)象 function Person(name...
摘要:而且在超類型的原型中定義的方法,對(duì)子類型而言也是不可見(jiàn)的,結(jié)果所有類型都只能使用構(gòu)造函數(shù)模式。在主要考慮對(duì)象而不是自定義類型和構(gòu)造函數(shù)的情況下,這個(gè)模式也不錯(cuò)。 寫在前面 注:這個(gè)系列是本人對(duì)js知識(shí)的一些梳理,其中不少內(nèi)容來(lái)自書籍:Javascript高級(jí)程序設(shè)計(jì)第三版和JavaScript權(quán)威指南第六版,感謝它們的作者和譯者。有發(fā)現(xiàn)什么問(wèn)題的,歡迎留言指出。 1.原型鏈 將原型鏈作...
閱讀 1579·2021-10-18 13:35
閱讀 2359·2021-10-09 09:44
閱讀 813·2021-10-08 10:05
閱讀 2707·2021-09-26 09:47
閱讀 3560·2021-09-22 15:22
閱讀 427·2019-08-29 12:24
閱讀 1993·2019-08-29 11:06
閱讀 2853·2019-08-26 12:23