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