constructor prototype __proto__

什么是对象
若干属性的集合

什么是原型?
原型是一个对象,其他对象可以通过它实现继承。

哪些对象有原型?
所有的对象在默认情况下都有一个原型,因为原型本身也是对象,所以每个原型自身又有一个原型(只有一种例外,默认的对象原型在原型链的顶端)

任何一个对象都可以成为原型
*******************************************************************

 function Person(name){
        this.name=name;
    }
Person.prototype.sayName=function(){
    console.log(this.name);
}
    
var person=new Person("xl");
  1. prototype : prototype是每个 函数对象 都具有的属性,被称为原型对象。

  2. constructor始终 指向创建当前对象的构造函数
    任何一个对象都有constructor属性

    1. 如果我们重写这个Person.prototype属性,那么constructor属性的指向就会发生改变了。
    Person.prototype={
        sayName:function(){
            console.log(this.name);
        }
    }
    
    console.log(Person.prototype.constructor);// 输出 function Object(){}  
    //这里为什么会输出function Object(){}
    //还记得之前说过constructor属性始终指向创建这个对象的构造函数吗?
    
    //这里实际上是对原型对象的重写:
    Person.prototype = new Object(){
        sayName:function(){
            console.log(this.name);
        }
    }
    //看到了吧。现在Person.prototype.constructor属性实际上是指向Object的。
    
    //那么我如何能将constructor属性再次指向Person呢?
    Person.prototype.constructor=Person;
    1. person实例继承了Person.prototype原型对象的所有的方法和属性,包括constructor属性。(每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性)
  3. proto : 指向构造该对象的构造函数的原型 (上一级原型) 。

    每个对象都有 __ proto__ 属性。
    其实这个属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到,所以使用 __ proto __ 来访问。

总结:

  1. constructor : 在原型中,指向构造函数。实例继承原型所得此属性,指向与原型中的相同
  2. __ proto__ :在实例对象中,指向生成此实例的构造函数的原型。原型也是对象(不在原型链顶端)也有此属性,指向它的构造函数的原型(上一级原型)。
    使用Object.getPrototypeOf()代替__proto__

  3. object instanceof constructor instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

猜你喜欢

转载自www.cnblogs.com/topyang/p/11397152.html
今日推荐