理解js中的prototype, constructor, __

作者: WMLJS | 来源:发表于2017-08-09 11:38 被阅读58次

    作为小白一直都被这几个概念困扰,最近浏览了很多人的文章,再结合自己的想法把自己的理解写成此文(希望各位把有错的地方指出,谢谢!)

    概念引入:

    • prototype(显式原型)

      1. 每个函数对象创建之后都有一个prototype属性 (注意是函数对象不是每个对象)
      2. prototype指向一个对象(原型对象),该对象包含这个函数对象的实例共享的属性和方法。
      3. prototype默认有属性:constructor,指向这个函数对象的本身(也有__proto__,因为每个对象都有__proto__)
      4. 特例:Object.prototype的__proto__是null
    • __proto__:(隐式原型)

      1. 每个对象都有一个__proto__属性(隐藏属性),es5中获取此值的方法是:Object.getPrototypeOf(obj)
      2. __proto__属性指向创建该对象的函数的prototype(创建该对象的函数的原型对象)
      3. js的继承其实是由__proto__实现
    • constructor:

      1. 每个对象都有constructor属性,指向创建这个对象的构造函数
      2. prototype中的constructor属性指向prototype对象所在的函数对象

    注意:

    1. 只有函数对象才有prototype属性
    2. 所有对象都有constructor属性和__proto__属性
    //所有对象都有constructor属性
    function person() { }
    console.log(person.constructor); //输出Function对象
    console.log(person.prototype.constructor) //输出person函数对象本身
    var arr = [1, 2];
    console.log(arr.constructor); //输出Array对象
    //所有对象都有__proto__属性
    function person() { }
    console.log(person.__proto__); //输出person的原型
    console.log(person.prototype.__proto__) //输出Object对象
    var arr = [1, 2];
    console.log(arr.__proto__); //输出Array对象的原型对象
    

    代码和图解:

    function Person(name){
        this.name=name;
    }
    Person.prototype.sayName=function(){
        console.log(this.name);
    }
    
    var personOne=new Person("a");
    var personTwo=new Person("b");
    
    personOne.sayName(); // 输出  "a"
    personTwo.sayName(); //输出 "b"
    
    console.log(personOne.__proto__==Person.prototype); // true
    console.log(personTwo.__proto__==Person.prototype); // true
    
    console.log(personOne.constructor==Person); //true
    console.log(personTwo.constructor==Person); //true
    console.log(Person.prototype.constructor==Person); //true
    
    console.log(Person.constructor); //function Function(){}
    console.log(Person.__proto__.__proto__); // Object{}
    
    image.png
    console.log(Function.__proto__);  //function () { [native code] }
    console.log(Function.prototype.__proto__);  //Object.prototype
    console.log(Function.constructor);  //function Function() { [native code] }
    console.log(Object.__proto__);  //function () { [native code] }
    console.log(Object.prototype.__proto__);  //null
    console.log(Object.constructor);  //function () { [native code] }
    
    console.log(Object.__proto__ === Function.prototype); //true
    console.log(Function.__proto__ === Function.prototype); //true
    console.log(Object.constructor === Function); //true
    

    参考文章

    相关文章

      网友评论

        本文标题:理解js中的prototype, constructor, __

        本文链接:https://www.haomeiwen.com/subject/upyfrxtx.html