每個(gè)對(duì)象都有一個(gè)constructor
function Animal(){
}
var anim = new Animal();
在 JavaScript 中闰围,每個(gè)函數(shù)對(duì)象都有名為“prototype”的屬性(上面提到過Function.prototype函數(shù)對(duì)象是個(gè)例外捏顺,沒有prototype屬性)革娄,
用于引用原型對(duì)象恬涧。此原型對(duì)象又有名為“constructor”的屬性,它反過來引用函數(shù)本身关炼。這是一種循環(huán)引用,而函數(shù)也是對(duì)象具有__proto__
屬性
Animal._proto__. constructor
就指向了構(gòu)造它的構(gòu)造函數(shù)
Animal.prototype.constructor===Animal //true
普通對(duì)象constructor指向問題
Object.hasOwnProperty("constructor")//false
console.dir(Object)
上面兩句都可以看出Object構(gòu)造函數(shù)沒有直接的constructor屬性昆淡,而是在他的prototype上面。
上圖可以看出Animal也沒有直接的constructor屬性盒件,而是在他的prototype上面蹬碧,綜上可知:所有的函數(shù)默認(rèn)情況下其constructor都是在prototype上面。所以
anim.constructor===anim.__proto_._constructor===Animal.prototype.constructor
,所以在創(chuàng)建構(gòu)造函數(shù)的時(shí)候經(jīng)常指定構(gòu)造函數(shù)為自身炒刁,這樣其實(shí)例化的對(duì)象的constructor就指向了創(chuàng)建他的函數(shù)恩沽。
function Person (name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype = {
constructor:Person,//指定其構(gòu)造函數(shù)為自身
sayHello:function(){
console.log('hello');
}
}
如果不加constructor:
Person.prototype = {
sayHello:function(){
console.log('hello');
}
}
第一級(jí)proto沒了constructor,而是在第二級(jí)翔始,也就是Object.prototype.constructor罗心。
如果想避免這種情況可以不直接給函數(shù)賦對(duì)象,而是一個(gè)個(gè)屬性賦值:
Person.prototype.sayHello = function(){
console.log('hello');
}
這樣的話constructor默認(rèn)指向了Person
1. 對(duì)象字面量構(gòu)造出的對(duì)象的構(gòu)造函數(shù)就是Object()
var kk={};
kk.constructor
//function Object() { [native code] }
kk.constructor===Object //true
2. 通過構(gòu)造函數(shù)構(gòu)造出來的普通對(duì)象
anim.constructor
//function Animal(){}
3. 函數(shù)對(duì)象
Animal.constructor
//function Function() { [native code] }
Animal===Animal.prototype.constructor //true
Function.prototype.constructor===Function //true
每個(gè)函數(shù)的的原型的構(gòu)造器都指向它自己
4. Object和Function函數(shù)對(duì)象
Object.constructor===Function //true
Function.constructor===Function //true
因?yàn)镺bject和Function函數(shù)對(duì)象都是由Function構(gòu)造函數(shù)new來的
5. 其他js內(nèi)置對(duì)象
Array,String,Number,Boolean,Date,RegExp;Math,JSON,console
Array,String,Number,Boolean,Date,RegExp 這個(gè)幾個(gè)都是函數(shù)城瞎,typeof后為:"function",所以他們的構(gòu)造函數(shù)指向Function()
Math,JSON,console typeof后為"object",他們的構(gòu)造函數(shù)指向Object()
結(jié)論:每個(gè)對(duì)象的構(gòu)造函數(shù)指向構(gòu)造出來他的函數(shù)渤闷,每個(gè)函數(shù)的的原型的構(gòu)造器都指向它自己
constructor并沒什么作用,instanceof 的原理就是右邊變量的 prototype 在左邊變量的原型鏈上就通過全谤,并不是根據(jù)constructor判斷肤晓。
JavaScript 中對(duì)象的 constructor 屬性的作用是什么爷贫?賀老指出:
constructor屬性不影響任何JavaScript的內(nèi)部屬性认然。instanceof檢測(cè)對(duì)象的原型鏈补憾,通常你是無法修改的(不過某些引擎通過私有的proto屬性暴露出來)。constructor其實(shí)沒有什么用處卷员,只是JavaScript語言設(shè)計(jì)的歷史遺留物盈匾。由于constructor屬性是可以變更的,所以未必真的指向?qū)ο蟮臉?gòu)造函數(shù)毕骡,只是一個(gè)提示削饵。不過,從編程習(xí)慣上未巫,我們應(yīng)該盡量讓對(duì)象的constructor指向其構(gòu)造函數(shù)窿撬,以維持這個(gè)慣例。
Js中Prototype叙凡、proto劈伴、Constructor、Object握爷、Function關(guān)系介紹