概述
在JavaScript中,我们创建一个函数A(就是声明一个函数), 那么浏览器就会在内存中创建一个对象B,函数默认会有一个属性 prototype 指向了这个对象( 即:prototype的属性的值是这个对象 )。这个对象B就是函数A的原型对象,简称函数的原型。这个原型对象B 默认会有一个属性 constructor 指向了这个函数A ( 意思就是说:constructor属性的值是函数A )。
prototype属性 它是一个对象— 原型对象
原型链
对象中的原型的指向
多个new对象的原型的指向
关于原型中的各个属性和属性值的说明:
prototype属性:prototype 存在于构造函数中 ,他指向了这个构造函数的原型对象。
constructor属性:constructor属性存在于原型对象中,他指向了构造函数
Person.prototype.constructor === Person // true
proto 属性:
用构造方法创建一个新的对象之后,这个对象中默认会有一个不可访问的属性 [[prototype]] , 这个属性就指向了构造方法的原型对象。
但是在个别浏览器中,也提供了对这个属性[[prototype]]的访问(chrome浏览器和火狐浏览器。ie浏览器不支持)。访问方式_proto_hasOwnProperty():可以判断一个属性是否来自对象本身
访问一个对象的属性的时候,这个属性既有可能来自对象本身,也有可能来自这个对象的[[prototype]]属性指向的原型。in 操作符:判断一个属性是否存在于这个对象中
对象属性的方法属性的搜索机制,首先在对象本身中找,如果对象找不到再去原型中找。只要对象和原型中有一个地方存在这个属性,就返回tru。
总结
- 所有的引用类型(数组,对象,函数),都具有对像特性,即可自由扩展属性(除了null)
- 所有的引用类型(数组,函数,对象),都有一个proto属性,属性值是一个普通对象
- 所有的函数,都有一个 prototype 属性,属性值也是一个普通的对象
- 函数的 prototype 称显式原型,引用类型的 _proto 成为隐式原型
- 所有的引用类型(数组,函数,对象),其 proto属性值都指向其构造函数的 prototype 属性值
- 当试图获取一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的prot_(即它的构造函数的prototype)