理解prototype和__proto__以及constructor

var A=function(){
    this.name = "test"
 }
A.prototype.sayHello = function(){
    console.log(this.name);
}
A.prototype.old = 18;
var a = new A()

console.log(a.__proto__ ===  A.prototype)      // true
console.log(A.__proto__ ===  Function.prototype)      // true
console.log(A.prototype.__proto__ === Object.prototype)      // true
console.log(A.prototype.constructor===A)      // true
console.log(a.prototype)  // undefined
a.sayHello()  // test
a.toString()  // "[object Object]"

在此例子中,对象实例a的__proto__指向其构造函数A的原型链prototype对象;
js函数本身也是对象,构造函数A的__proto__指向其构造函数Function的原型链;
A.prototype是一个对象,并不是一个函数,它的__proto__指Object.prototype;
A.prototype包括添加的函数sayHello和属性old,内置构造函数constructor,和其__proto__,
A的原型链构造函数指向A函数本身
a并不是函数,没有prototype属性
a实例本身并没有sayHello()方法,但a.__proto__上有sayHello()方法。当执行a.sayHello()时,先从a对象本身查找,如果找到,直接执行,如果没找到该方法,会从a的_proto上继续搜索该方法,所以会打印出test。
假如A.prototype也不存在该方法,继续从A.prototype._proto
上查找,直至最顶层
Object.prototype

你可能感兴趣的:(理解prototype和__proto__以及constructor)