摘要:屬性中屬性指向創(chuàng)建當(dāng)前對象的構(gòu)造函數(shù)。既然是屬性時(shí)從屬于構(gòu)造函數(shù)的那么為什么實(shí)例也有屬性呢,這是為什么原因如下本身還是實(shí)例的原型。
constructor屬性
JavaScript中constructor屬性指向創(chuàng)建當(dāng)前對象的構(gòu)造函數(shù)。
var a = "zuckjet"; console.log(a.constructor) // ? String() { [native code] } function b() {} console.log(b.constructor) // ? Function() { [native code] } var c = {name: "zuckjet"}; console.log(c.constructor); //? Object() { [native code] }起源
看了上面的代碼示例,也許你會覺得constructor屬性在對象里,但其實(shí)constructor屬性是在原型里。
function test() {} var obj = new test(); console.log(obj.hasOwnProperty("constructor")); //false console.log(obj.__proto__.hasOwnProperty("constructor")); //true
hasOwnProperty方法是來判定對象是否包含指定名稱的屬性,不會向原型鏈搜索。要想搜索原型鏈可以用in關(guān)鍵字(’constructor’ in obj)。
既然是constructor屬性時(shí)從屬于構(gòu)造函數(shù)的prototype,那么為什么實(shí)例也有constructor屬性呢?
function Foo() {} var foo = new Foo() foo.constructor === Foo // true,這是為什么
原因如下:
Foo.prototype本身還是實(shí)例foo的原型。
由于原型鏈機(jī)制,當(dāng)在foo中查找屬性constructor時(shí),如果沒有找到,則往原型上找。而Foo.prototype剛好有屬性constructor。
foo.constructor的值就是Foo.prototype.constructor的值,也就是Foo。
constructor屬性是不可靠的function Foo() {} Foo.prototype = {} var foo = new Foo() foo.constructor === Object // true,可以看出不是Foo了
foo沒有constructor屬性,還是往原型Foo.prototype上找
Foo.prototype本來是有constructor屬性的,但是在這里它已經(jīng)被重新定義變成{}
找不到constructor,接著往原型鏈上查找。({}是由Object構(gòu)造函數(shù)生成的,它的原型是Object.prototype)找到了Object.prototype,含有屬性constructor,值為Object
用處為了將實(shí)例的構(gòu)造器的原型對象暴露出來, 比如你寫了一個(gè)插件,別人得到的都是你實(shí)例化后的對象, 如果別人想擴(kuò)展下對象,就可以用 instance.constructor.prototype 去修改或擴(kuò)展原型對象
部分內(nèi)容參考自:
參考鏈接1
參考鏈接2
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107377.html
摘要:于是退而求其次叫為類的構(gòu)造函數(shù)。如果這個(gè)函數(shù)被用在創(chuàng)建自定義對象的場景中,我們稱這個(gè)函數(shù)為構(gòu)造函數(shù)。遇到的問題始終指向創(chuàng)建當(dāng)前對象的構(gòu)造函數(shù)。 Object.constructor,prototype 對象的prototype和constructor是兩個(gè)重要的屬性,他們總是成對出現(xiàn),提到constructor的地方,不得不涉及到另外一個(gè)非常重要的屬性prototype,它是js中基于...
摘要:構(gòu)造函數(shù)和實(shí)例都通過屬性指向了原形。代碼示例是構(gòu)造函數(shù)的實(shí)例的屬性與的屬性保存的值相等,即他們指向同一個(gè)對象原形。 講清楚之javascript原型 標(biāo)簽: javascript javascript 中原形是一個(gè)比較難于理解的概念。javascript 權(quán)威指南在原形這一章也花了大量的篇幅進(jìn)行介紹,也許你已經(jīng)讀過javascript 權(quán)威指南,或者已經(jīng)是讀第N篇了,然而這篇文章的目...
摘要:先來說其實(shí)構(gòu)造函數(shù)也有,原型對象有,實(shí)例有也有,或者更加籠統(tǒng)的說,所有對象都是有的。構(gòu)造函數(shù)的原型對象上的會指向構(gòu)造函數(shù)。由于屬性是可以變更的,所以未必真的指向?qū)ο蟮臉?gòu)造函數(shù),只是一個(gè)提示。 續(xù)上一集內(nèi)容,通過構(gòu)造函數(shù)的方式,成功地更新了生產(chǎn)技術(shù),老板笑呵呵,工人少奔波,只是問題總比辦法多,又遇到一個(gè)新問題,就是會造成一些資源的重復(fù)和浪費(fèi),那么經(jīng)過工程師們的智慧交流,他們產(chǎn)生了一個(gè)新技...
摘要:三種使用構(gòu)造函數(shù)創(chuàng)建對象的方法和的作用都是在某個(gè)特殊對象的作用域中調(diào)用函數(shù)。這種方式還支持向構(gòu)造函數(shù)傳遞參數(shù)。叫法上把函數(shù)叫做構(gòu)造函數(shù),其他無區(qū)別適用情境可以在特殊的情況下用來為對象創(chuàng)建構(gòu)造函數(shù)。 一、工廠模式 工廠模式:使用字面量和object構(gòu)造函數(shù)會有很多重復(fù)代碼,在此基礎(chǔ)上改進(jìn)showImg(https://segmentfault.com/img/bVbmKxb?w=456&...
閱讀 1996·2021-09-04 16:45
閱讀 792·2019-08-30 15:44
閱讀 922·2019-08-30 13:07
閱讀 486·2019-08-29 16:06
閱讀 1407·2019-08-29 13:43
閱讀 1319·2019-08-26 17:00
閱讀 1549·2019-08-26 13:51
閱讀 2324·2019-08-26 11:48