js constructor的理解
2017-04-19 本文已影响183人
别过经年
每个对象都有一个constructor
function Animal(){
}
var anim = new Animal();
在 JavaScript 中,每个函数对象都有名为“prototype”的属性(上面提到过Function.prototype函数对象是个例外,没有prototype属性),
用于引用原型对象。此原型对象又有名为“constructor”的属性,它反过来引用函数本身。这是一种循环引用,而函数也是对象具有__proto__
属性
Animal._proto__. constructor
就指向了构造它的构造函数
Animal.prototype.constructor===Animal //true
![](https://img.haomeiwen.com/i910389/6b785557feb50ca5.png)
普通对象constructor指向问题
Object.hasOwnProperty("constructor")//false
console.dir(Object)
上面两句都可以看出Object构造函数没有直接的constructor属性,而是在他的prototype上面。
![](https://img.haomeiwen.com/i910389/784f325bb02ec552.png)
上图可以看出Animal也没有直接的constructor属性,而是在他的prototype上面,综上可知:所有的函数默认情况下其constructor都是在prototype上面。所以
anim.constructor===anim.__proto__constructor===Animal.prototype.constructor
,所以在创建构造函数的时候经常指定其构造函数为自身,这样其实例化的对象的constructor就指向了创建他的函数。
function Person (name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype = {
constructor:Person,//指定其构造函数为自身
sayHello:function(){
console.log('hello');
}
}
如果不加constructor:
Person.prototype = {
sayHello:function(){
console.log('hello');
}
}
![](https://img.haomeiwen.com/i910389/2f73cbb8389cdf5c.png)
第一级proto没了constructor,而是在第二级,也就是Object.prototype.constructor。
如果想避免这种情况可以不直接给函数赋对象,而是一个个属性赋值:
Person.prototype.sayHello = function(){
console.log('hello');
}
这样的话constructor默认指向了Person
1. 对象字面量构造出的对象的构造函数就是Object()
var kk={};
kk.constructor
//function Object() { [native code] }
kk.constructor===Object //true
2. 通过构造函数构造出来的普通对象
anim.constructor
//function Animal(){}
3. 函数对象
Animal.constructor
//function Function() { [native code] }
Animal===Animal.prototype.constructor //true
Function.prototype.constructor===Function //true
每个函数的的原型的构造器都指向它自己
4. Object和Function函数对象
Object.constructor===Function //true
Function.constructor===Function //true
因为Object和Function函数对象都是由Function构造函数new来的
5. 其他js内置对象
Array,String,Number,Boolean,Date,RegExp;Math,JSON,console
Array,String,Number,Boolean,Date,RegExp 这个几个都是函数,typeof后为:"function",所以他们的构造函数指向Function()
Math,JSON,console typeof后为"object",他们的构造函数指向Object()
结论:每个对象的构造函数指向构造出来他的函数,每个函数的的原型的构造器都指向它自己