原型和原型链(隐式原型)

发布时间 2023-06-21 15:26:41作者: 有只小菜猫

1)函数对象——就是平时称的对象;

2)实例对象——new出的对象或者{ };

3)原型对象——所有的函数对象都有一定有一个对应的原型对象,所有的原型对象都是被Object函数对象创建出来的

  • 所有的函数对象中都有一个名字叫prototype的引用类型变量,该引用类型变量是函数对象的成员,它的值是对应的原型对象的引用值,即prototype指向原型对象

  • 所有的原型对象中都有一个名为constructor引用类型变量,该引用类型变量是原型对象的成员,该引用类型变量的值是对应的函数对象的引用值,即constructor指向函数对象

  • 实例对象是被对应的函数对象(new出来的那个函数)创建的。

  • 所有对象中都有一个名为proto的引用类型变量,该引用类型变量是对象的成员

  • Function函数对象中proto指向Function原型对象

  • Object函数对象中proto值为null

1.1 原型= =>本质:对象

原型是函数的一个属性【prototype】==>通过它实例的对象可以继承得到原型上的所有属性方法

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

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

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

1.2 隐式原型

  • 所有的对象都有隐式原型:__ proto __属性

  • 指向prototype

  • 查找成员对象,如果没有该对象,会到隐式原型中查找

【原型和隐式原型出现原因:JS没有记录类型的元数据。只能通过各个对象的隐式原型来找到创建他的函数原型】

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

 

// 构造函数
function Person(name) {
this.name = name
}
// 往原型对象中添加方法
Person.prototype.say = function () {
console.log('我是小新')
}
var p1 = new Person('新哥')
console.log(p1)
var p2 = new Person('铭桑')
console.log(p2)
// 通过实例化的对象访问继承的原型
// console.log(p1.__proto__)
// console.log(Person.prototype)
// 原型对象通过constructor可以访问到构造函数
// console.log(Person.prototype.constructor)
// 原型对象下也有一个name属性
Person.prototype.name = 'xxx'
// 如果要访问name,首先到当前实例化对象中去寻找,如果找不到会到原型中去查找,这就是原型链的
关系
// 删除当前对象中的name
// delete p1.name
// console.log(p1.name)
// 最早的对象创建 new Object()
// 原型对象也是一个对象,就是通过new Object()创建而来
console.log(Person.prototype.__proto__)
console.log(Person.prototype.__proto__ === Object.prototype)