构造函数有prototype属性
构造函数的prototype属性里又包含constructor,constructor又指回构造函数
实例对象有proto属性,这两个属性是相等的
function Person{ var person1=new Person() console.log(person1._proto_===Person.prototype) } //true
顺便学习一个es5的方法可以获得对象的原型
console.log(Object.getPrototypeOf(person1)===Person.prototype)
实例与原型
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就会去找原型的原型,一直找到最顶层为止,如果自己有就不会在往上找啦
function Person(){ } Person.prototype.name="name" var person1 =new Person() person1.name="name of this person1" console.log(person1.name) //name delete person1.name console.log(person1.name)
此外还有一句话,实例对象的proto指向构造函数的prototype.也就是说Person.prototype这个原型对象(实例原型是object的实例,所以这个实例会有proto属性指向构造函数原型对象object.prototype)
探讨instanceof
实例 instanceof 构造函数
也就是说A实例对象的原型链上可能会有很多对象,只要b构造函数的原型对象有一个是在其原型脸上的对象即刻返回true
一些概念的梳理
所有函数都有一个特别的属性
prototype:显示原型属性
所有实例对象都有一个特别的属性
__proto__:隐式原型属性
显示原型与隐式原型的关系
函数prototype:定义函数时被自动赋值,值默认为{}
实例对象的__proto__:在创建实例对象时被自动添加,并赋值为构造函数的prototype值
原型对象即为当前对象的父对象
原型链
所有的实例对象都有__proto__属性,他指向的就是原型对象
这样通过__proto__,他指向的就是原型对象
这样通过__proto__属性就形成了一个链的结构---->原型链
当查找对象内部的属性/方法时,js引擎自动沿着这个原型链查找
当给对象属性赋值时,不会使用原型链,而只是在当前对象中进行操作