一、须知
1、函数对象:
new 出的对象是由函数对象创建的。
所有的函数对象中都有一个名为【prototype】的引用类型变量
所有的函数对象中都有prototype属性,原型对象和new 出来的对象中没有
其变量是函数对象的成员,其值为对应的原型对象的引用值===>【prototype指向原型对象】
2、原型对象:
所有的原型对象都是由Object对象创建的
Object的原型对象中的成员,可以所有对象访问,Object是原型链的尽头,Object原型对象通过Object.prototype得到。
(1)constructor
所有的原型对象中都有一个名为【constructor】的引用类型变量,
其变量是原型对象的成员,其值为对应的函数对象的引用值===>【constructor指向函数对象(构造函数)】
原型对象通过constructor可以访问到构造函数【构造函数.prototype.constructor】
(2)_ _proto_ _
每个对象都有一个隐式的属性(__proto__),属性值本质上就是一个普通的对象
每个对象的__proto__指向构造函数的原型对象(prototype)
每个构造函数都有一个原型对象
原型对象都包含一个指向构造函数的指针,而实例都包含一个指向 原型对象的内部指针
3、实例对象:new创建的对象或者{}
// 制作生成矩形对象的构造函数 Rect function Rect(length, width) { // new运算符构造对象时, 会额外默认完成 // 为当前构造的对象, 关联其父元素 为 构造函数的prototype // this.__proto__ = Rect.prototype this.length = length this.width = width // 新增计算面积的方法 // this.area = function () { // return this.length * this.width // } } // 构造函数 -- 相当于 母亲角色, 能生对象 // 构造函数必然存在 prototype 属性, 即其丈夫 // prototype.constructor : 关联到构造函数, 即丈夫的妻子 console.dir(Rect) //查看 prototype 属性 // 把共享的方法,存储在 prototype 原型中 Rect.prototype.area = function () { return this.length * this.width } // 用法: // r1: 母亲通过new方案 生下来的对象 var r1 = new Rect(10, 20) // {length: 10, width:20} console.log(r1) // 母亲的丈夫 == 孩子的父亲 // 原型属性的名称 : __proto__ 是未经美化的原属性名 // 由于官方的要求, 浏览器必须按照固定规则 美化后再显示 console.log(Rect.prototype == r1.__proto__) // true console.log( // JS引擎自带 原型链机制: // 白话文: 我自己没有的东西, 找我爸爸要 // 专业: 自身没有的属性, 到原型链__proto__中查找 r1.area() ) // 构造函数能够反复多次调用, 每次调用都会执行函数中的代码 var r2 = new Rect(20, 30) var r3 = new Rect(40, 50) // 代表两个对象中的area 函数非同一个 console.log(r2.area == r3.area) //false // 问题: 在构造函数中, 为对象添加方法属性, 导致内存的浪费. 因为方法是可以共享的
二、原型和原型链
原型:
每个构造函数都有原型对象,是通过 Person.prototype来访问到的
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向 原型对象的内部指针
-
-
每个构造函数都有一个 prototype 属性,该属性指向实例对象的原型对象
-
原型对象里的 constructor 指向构造函数本身
原型链:
当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾null
三、提问?
1、对象中的__proto__的值是哪个对象的引用值?即指向哪个对象
自定义函数(Function函数)对象中【__proto__】指向Function原型对象
对象函数(Object函数)对象中【__proto__】值为null、
2、对象访问成员的过程
1)当前对象中如果有该成员就该到该成员,访问结束;
2)当前对象中如果没有该成员,则到__proto__指向的对象中找到成员,找到就结束,如果没有找到,就继续通过__proto__指向的对象中去找。
3、prototype|__photo__|constructor三者之间的关系
prototype、__photo_:指向的原型
constructor:原型上的属性指向构造函数