摘要:聽起來確實(shí)有點(diǎn)懵逼書中示例大概就說明了是指向它的類的默認(rèn)情況下好了,下面我們來看看下面的繼承行留意下面這一句的作用注釋掉后的結(jié)果會(huì)發(fā)現(xiàn),去掉這句還是能調(diào)用類構(gòu)造函數(shù)并能成功得出想要的結(jié)果。
轉(zhuǎn)載請注明出處----在河?xùn)|
磚頭書中有道: 在默認(rèn)情況下,所有原型對象都會(huì)自動(dòng)獲得一個(gè) Constructor (構(gòu)造函數(shù))屬性,這個(gè)屬性 是指向prototype 屬性所在函數(shù)的指針。 (聽起來確實(shí)有點(diǎn)懵逼) 書中示例:
function Person(){ } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = functon(){ console.log(this.name); }
大概就說明了constructor是指向它的類的(默認(rèn)情況下)
好了,下面我們來看看下面的繼承:
function SuperType(name){ this.name = name; this.colors = ["red","blue","green"]; } SuperType.prototype.sayName = function(){ console.log(this.name); } function SubType(name , age){ SuperType.call(this,name); this.age = age; } /**12行*/SubType.prototype = new SuperType(); //留意下面這一句的作用 SubType.prototype.constructor = SubType; SubType.prototype.sayAge = function(){ console.log(this.age); } var instance1 = new SubType("HEDONGHUI",22); instance1.colors.push("black"); console.log(instance1.colors); instance1.sayName(); instance1.sayAge(); var instance2 = new SubType("heod",23); console.log(instance2.colors); instance2.sayName(); instance2.sayAge();
注釋掉 SubType.prototype.constructor = SubType; 后的結(jié)果:
會(huì)發(fā)現(xiàn),去掉這句instance1 , instance2 還是能調(diào)用Subtype類構(gòu)造函數(shù)并能成功得出想要的結(jié)果。那么問題來了,這句話在原型繼承中的作用是什么呢?
從前文我們知道,原型的constructor 默認(rèn)指向原對應(yīng)的類型。第12行執(zhí)行完后,SubType原型(SubType.prototype) 指向了SuperType的實(shí)例對象,而SuperType的實(shí)例對象的構(gòu)造器是構(gòu)造函數(shù)SuperType,所以 SubType.prototype.constructor就是構(gòu)造對象SuperType了(換句話說,SuperType構(gòu)造了SubType的原型)。
這里實(shí)例instance1 ,SubType.prototype.constructor都為 SuperType。這就導(dǎo)致了
SubType.prototype === instance1.constructor.prototype 為false; 這樣會(huì)令人產(chǎn)生費(fèi)解,既然在一開始中
(前文)說到原型指向所在的類型,一般情況下,instance1.constructor為SubType 。 SubType.prototype ===
SubType.prototype的。 由于第12行代碼實(shí)現(xiàn)了,SubType 繼承 SuperType導(dǎo)致了 SubType.prototype.constructor
指向了SuperType(),因此,這行代碼的作用就是為了修正因?yàn)槔^承SuperType對象所有成員后,SubType的構(gòu)造器也指向了SuperType.
那么,為什么注釋掉也能正確調(diào)用SubType()構(gòu)造函數(shù)去實(shí)例化instance1呢?
雖然instance1.constructor ===SuperType() 返回true, 但對于執(zhí)行第12行來說,SubType.prototype實(shí)例化了 繼承來的父類的方法和屬性。在 instance1 = new SubType("heodnghui",22)中,instance1.__proto__由于 SubType.prototype指向了SuperType 而被修改為 SuperType。 因此也獲得了父類繼承來的屬性和方法 (盡管constructor也指向了SuperType)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88742.html
摘要:基于原型的面向?qū)ο笤诨谠偷恼Z言中如并不存在這種區(qū)別它只有對象不論是構(gòu)造函數(shù),實(shí)例,原型本身都是對象。允許動(dòng)態(tài)地向單個(gè)的對象或者整個(gè)對象集中添加或移除屬性。為了解決以上兩個(gè)問題,提供了構(gòu)造函數(shù)創(chuàng)建對象的方式。 showImg(https://segmentfault.com/img/remote/1460000013229218); 一. 重新認(rèn)識面向?qū)ο?1. JavaScript...
摘要:基于原型的面向?qū)ο笤诨谠偷恼Z言中如并不存在這種區(qū)別它只有對象不論是構(gòu)造函數(shù),實(shí)例,原型本身都是對象。允許動(dòng)態(tài)地向單個(gè)的對象或者整個(gè)對象集中添加或移除屬性。為了解決以上兩個(gè)問題,提供了構(gòu)造函數(shù)創(chuàng)建對象的方式。 showImg(https://segmentfault.com/img/remote/1460000013229218); 一. 重新認(rèn)識面向?qū)ο?1. JavaScript...
摘要:前言前兩天總結(jié)了一下方面的面試題傳送門,今天翻看了一些面試中常見的幾個(gè)問題只是一部分,會(huì)持續(xù)更新,分享給有需要的小伙伴,歡迎關(guān)注如果文章中有出現(xiàn)紕漏錯(cuò)誤之處,還請看到的小伙伴留言指正,先行謝過以下有哪些數(shù)據(jù)類型種原始數(shù)據(jù)類型布爾表示一個(gè)邏輯 前言 前兩天總結(jié)了一下HTML+CSS方面的面試題 (傳送門),今天翻看了一些 JavaScript 面試中常見的幾個(gè)問題(只是一部分,會(huì)持續(xù)更新...
摘要:而作為構(gòu)造函數(shù),需要有個(gè)屬性用來作為以該構(gòu)造函數(shù)創(chuàng)造的實(shí)例的繼承。 歡迎來我的博客閱讀:「JavaScript 原型中的哲學(xué)思想」 記得當(dāng)年初試前端的時(shí)候,學(xué)習(xí)JavaScript過程中,原型問題一直讓我疑惑許久,那時(shí)候捧著那本著名的紅皮書,看到有關(guān)原型的講解時(shí),總是心存疑慮。 當(dāng)在JavaScript世界中走過不少旅程之后,再次萌發(fā)起研究這部分知識的欲望,翻閱了不少書籍和資料,才搞懂...
閱讀 1074·2021-11-12 10:34
閱讀 1001·2021-09-30 09:56
閱讀 676·2019-08-30 15:54
閱讀 2611·2019-08-30 11:14
閱讀 1476·2019-08-29 16:44
閱讀 3215·2019-08-29 16:35
閱讀 2500·2019-08-29 16:22
閱讀 2453·2019-08-29 15:39