JavaScript小结Js方法延伸

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

普通对象constructor指向问题
Object.hasOwnProperty("constructor")//false
console.dir(Object)

上面两句都可以看出Object构造函数没有直接的constructor属性,而是在他的prototype上面。


上图可以看出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');
    }
}
图片.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()

结论:每个对象的构造函数指向构造出来他的函数,每个函数的的原型的构造器都指向它自己

Js中Prototype、proto、Constructor、Object、Function关系介绍

上一篇 下一篇

猜你喜欢

热点阅读