摘要:如果按照字面意思來(lái)理解,那么就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。
創(chuàng)建對(duì)象方法
Object構(gòu)造函數(shù)
對(duì)象字面量表示
工廠模式
構(gòu)造函數(shù)模式
原型模式
構(gòu)造函數(shù)模式與原型模式結(jié)合
動(dòng)態(tài)原型模式
寄生構(gòu)造函數(shù)模式
一、Object實(shí)例創(chuàng)建var person1 = new Object(); person1.name = "bob"; person1.age = "22"; person1.job = "frontend"; person1.sayName = function () { console.log(this.name); } person1.sayName(); // bob console.log(person1.age); // 22二、對(duì)象字面量表示
var person2 = { name: "bob", age: 22, job: "frontend", sayName: function () { console.log(this.name); } } person2.sayName(); // bob三、工廠模式
function createPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function () { console.log(this.name); }; return o; } var person1 = createPerson("bob", 22, "frontend"); var person2 = createPerson("lynn", 22, "doctor"); console.log(person1.name); // bob console.log(person2.name); // lynn
優(yōu)點(diǎn):函數(shù)封裝創(chuàng)建對(duì)象,無(wú)需寫(xiě)重復(fù)創(chuàng)建對(duì)象的代碼
缺點(diǎn):沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(怎么樣知道一個(gè)對(duì)象類型)
四、構(gòu)造函數(shù)模式function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function () { console.log(this.name); } /** * 與聲明函數(shù)在邏輯上是等價(jià)的 this.sayName = new Function("console.log(this.name)"); */ } var person1 = new Person("bob", 22, "frontend"); var person2 = new Person("lynn", 22, "doctor"); console.log(person1.name); // bob console.log(person2.name); // lynn
沒(méi)有顯式地創(chuàng)建對(duì)象
直接將屬性和方法賦給了this對(duì)象
沒(méi)有return語(yǔ)句
每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍
創(chuàng)建新的對(duì)象
將構(gòu)造函數(shù)的作用域賦給新對(duì)象,因此this就指向了這個(gè)對(duì)象
執(zhí)行構(gòu)造函數(shù)的代碼,為這個(gè)對(duì)象添加對(duì)象屬性和方法
返回新的對(duì)象
person1和person2分別保存著Person的一個(gè)不同的實(shí)例。這兩個(gè)對(duì)象都有一個(gè)constructor(構(gòu)造函數(shù))屬性,該屬性指向Person
console.log(person1.constructor === Person); // true console.log(person2.constructor === Person); // true
對(duì)象的constructor屬性最初是用來(lái)標(biāo)識(shí)對(duì)象類型的。但是,提到檢測(cè)對(duì)象類型,還是instanceof操作符要更可靠一些
console.log(person1 instanceof Object); // true console.log(person1 instanceof Person); // true console.log(person2 instanceof Object); // true console.log(person2 instanceof Person); // true
我們?cè)谶@個(gè)例子中創(chuàng)建的所有對(duì)象既是Object的實(shí)例,同時(shí)也是Person的實(shí)例,這一點(diǎn)通過(guò)instanceof操作符可以得到驗(yàn)證,創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來(lái)可以將它的實(shí)例標(biāo)識(shí)為一種特定的類型
// 當(dāng)作構(gòu)造函數(shù)使用 var person = new Person("bob", 22, "frontend"); person.sayName(); //"Nicholas" // 作為普通函數(shù)調(diào)用 Person("lynn", 22, "doctor"); // 添加到window window.sayName(); //"Greg" // 在另一個(gè)對(duì)象的作用域中調(diào)用 var o = new Object(); Person.call(o, "Kristen", 25, "Nurse"); o.sayName(); //"Kristen"
構(gòu)造函數(shù)創(chuàng)建的對(duì)象方法,實(shí)際上執(zhí)行多次函數(shù)創(chuàng)建,會(huì)導(dǎo)致不同的作用域鏈和標(biāo)識(shí)符解析,如:
console.log(person1.sayName == person2.sayName); //false
創(chuàng)建兩個(gè)完成同樣任務(wù)的Function實(shí)例的確沒(méi)有必要;況且有this對(duì)象在,根本不用在執(zhí)行代碼前就把函數(shù)綁定到特定對(duì)象上面。因此,大可像下面這樣,通過(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 = sayName; } // 把sayName函數(shù)抽離出外部函數(shù) function sayName() { console.log(this.name); }
存在問(wèn)題:
所有被新創(chuàng)建出來(lái)的對(duì)象,都會(huì)指向全局作用域的sayName函數(shù),如果定義N個(gè)方法,那么就要定義N個(gè)全局的方法,這就造成了封裝性的瓶頸,不過(guò)可以使用原型模式來(lái)解決
五、原型模式function Person() { } Person.prototype.name = "bob"; Person.prototype.age = 22; Person.prototype.job = "frontend"; Person.prototype.sayName = function () { return this.name } var person1 = new Person(); console.log(person1.name); // bob console.log(person1.age); // 22 console.log(person1.job); // frontend console.log(person1.sayName()); // bob console.log(person1.sayName === person2.sayName); // true
我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè)prototype(原型)屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法。如果按照字面意思來(lái)理解,那么prototype就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。使用原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法。
六、組合使用構(gòu)造函數(shù)模式和原型模式function Person(name, age, obj) { this.name = name; this.age = age; this.obj = obj; } Person.prototype = { constructor: Person, sayName: function () { console.log(this.name); } } var person1 = new Person("bob", 22, "frontend"); var person2 = new Person("lynn", 22, "doctor"); console.log(person1.name); // bob console.log(person2.name); // lynn console.log(person1.sayName === person2.sayName); // true七、動(dòng)態(tài)原型模式
function Person(name, age, obj) { this.name = name; this.age = age; this.obj = obj; console.log("typeof this.sayName: ", typeof this.sayName); // 檢測(cè)sayName 是不是一個(gè)函數(shù) // 實(shí)際上只在當(dāng)前第一次時(shí)候沒(méi)有創(chuàng)建的時(shí)候在原型上添加sayName方法 if (typeof this.sayName != "function") { Person.prototype.sayName = function () { return this.name; } } } var person1 = new Person("bob", 22, "frontend"); var person2 = new Person("lynn", 22, "doctor"); console.log(person1.name); // bob console.log(person2.name); // lynn console.log(person1.sayName()); // bob console.log(person2.sayName()); // lynn console.log(person1.sayName === person2.sayName); // true八、寄生構(gòu)造函數(shù)模式
function createPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function () { console.log(this.name); }; return o; } var person1 = new createPerson("bob", 22, "frontend"); var person2 = new createPerson("lynn", 22, "doctor"); console.log(person1.name); // bob console.log(person2.name); // lynn
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95937.html
摘要:原型式繼承利用一個(gè)空對(duì)象作為中介,將某個(gè)對(duì)象直接賦值給空對(duì)象構(gòu)造函數(shù)的原型。其中表示構(gòu)造函數(shù),一個(gè)類中只能有一個(gè)構(gòu)造函數(shù),有多個(gè)會(huì)報(bào)出錯(cuò)誤如果沒(méi)有顯式指定構(gòu)造方法,則會(huì)添加默認(rèn)的方法,使用例子如下。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo))showImg(https://segmentfault.com/img/rem...
摘要:使用也有很長(zhǎng)一段時(shí)間但是一直以來(lái)都沒(méi)對(duì)其組件之間的通信做一個(gè)總結(jié)這次就借此總結(jié)一下。引用信息將會(huì)注冊(cè)在父組件的對(duì)象上。 使用Vue也有很長(zhǎng)一段時(shí)間,但是一直以來(lái)都沒(méi)對(duì)其組件之間的通信做一個(gè)總結(jié),這次就借此總結(jié)一下。 父子組件之間的通信 1)props和$emit 父組件通過(guò)props將數(shù)據(jù)下發(fā)給props,子組件通過(guò)$emit來(lái)觸發(fā)自定義事件來(lái)通知父組件進(jìn)行相應(yīng)的操作 具體代碼如下: ...
摘要:假定期望交換和的值序號(hào)實(shí)現(xiàn)方案中間變量備注按位操作符只適用類型只適用類型有腦洞先執(zhí)行對(duì)象解構(gòu)賦值推薦數(shù)組解構(gòu)賦值簡(jiǎn)書(shū)首發(fā)轉(zhuǎn)載請(qǐng)注明來(lái)自簡(jiǎn)書(shū) 假定let a = 1,b=10;期望交換a和b的值 序號(hào) 實(shí)現(xiàn)方案 中間變量? 備注 1 let c; c = a; a = b; b = c; ? 2 a ^= b; b ^=a; a ^=b MDN-按位操作符, 只適...
摘要:中的詳解必修個(gè)多線程問(wèn)題總結(jié)個(gè)多線程問(wèn)題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開(kāi)源的運(yùn)行原理從虛擬機(jī)工作流程看運(yùn)行原理。 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 基于 POI 封裝 ExcelUtil 精簡(jiǎn)的 Excel 導(dǎo)入導(dǎo)出 由于 poi 本身只是針對(duì)于 ...
摘要:目標(biāo)追蹤首先,我們會(huì)大致介紹八種建立在上的目標(biāo)跟蹤算法。詞典包含了種的目標(biāo)追蹤器行。它將目標(biāo)追蹤器的命令行參數(shù)字符串映射到實(shí)際的追蹤器函數(shù)上。其中行里的目的是根據(jù)追蹤器命令行參數(shù)以及從得來(lái)的相關(guān)重要信息。 雖然我們熟知的的質(zhì)心追蹤器表現(xiàn)得很好,但它需要我們?cè)谳斎氲囊曨l上的每一幀運(yùn)行一個(gè)目標(biāo)探測(cè)器。對(duì)大多數(shù)環(huán)境來(lái)說(shuō),在每幀上進(jìn)行檢測(cè)非常耗費(fèi)計(jì)算力。所以,我們想應(yīng)用一種一次性的目標(biāo)檢測(cè)方法,然后...
閱讀 2777·2021-10-11 10:57
閱讀 1628·2021-09-26 09:55
閱讀 1350·2021-09-06 15:11
閱讀 3513·2021-08-26 14:16
閱讀 713·2019-08-30 15:54
閱讀 570·2019-08-30 12:43
閱讀 3345·2019-08-29 16:18
閱讀 2620·2019-08-23 16:14