原型和原型链

发布时间 2023-06-12 16:05:41作者: 有只小菜猫

一、须知

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来访问到的

每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向 原型对象的内部指针

  1. 每个对象都有一个 proto 属性,该属性指向自己的原型对象

  2. 每个构造函数都有一个 prototype 属性,该属性指向实例对象的原型对象

  3. 原型对象里的 constructor 指向构造函数本身

原型链:

当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾null

 

三、提问?

1、对象中的__proto__的值是哪个对象的引用值?即指向哪个对象

自定义函数(Function函数)对象中【__proto__】指向Function原型对象

对象函数(Object函数)对象中【__proto__】值为null、

 

2、对象访问成员的过程

1)当前对象中如果有该成员就该到该成员,访问结束;

2)当前对象中如果没有该成员,则到__proto__指向的对象中找到成员,找到就结束,如果没有找到,就继续通过__proto__指向的对象中去找。

 

3、prototype|__photo__|constructor三者之间的关系

prototype、__photo_:指向的原型

constructor:原型上的属性指向构造函数