1

js原型

教程地址:https://www.bilibili.com/video/av41708223?from=search&seid=2503409833258958402

总结:道生一,一生二,二生三,三生万物。(Object就是道,Objectprototype的对象就是道的终点,因为Objectprototype的对象隐式原型为null

显式原型和隐式原型

我们可以操作显示原型,无法操作隐式原型(es6之前)

每个function都有一个prototype属性,即显示原型

每个实例对象都有一个__proto__,可称为隐式原型

对象的隐式原型的值为其构造函数的显示原型的值。

函数的prototyp属性在定义函数的时候自动添加,默认值是一个空对象。

对象的__proto__的属性,在创建对象时自动添加,默认值为构造函数的prototype的属性值

显式原型prototype(Object)

为函数的prototype属性

函数的显示原型对象默认是空的Object对象的实例(但Object不满足)

隐式原型__proto__(Object)

指向构造函数的原型

原型链

当访问一个对象的属性时,

  • 先从自身的属性中查找,找到就返回
  • 如果没有就沿着__proto__(隐式原型链)这条链查找,找到返回
  • 如果最终没有找到,返回undefined

别名:隐式原型链

  • 作用:查找对象的属性(方法)

所有的函数的__proto__都是一样的,因为都是Function的实例(包括Function

function Foo(){}
// 相当于
const Foo = new Function()
// 相当于
Function = new Function()

Object对象的原型对象是原型链的尽头

console.log(Object.prototype.__proto__); // null

原型继承

构造函数的实例对象自动拥有构造函数的属性(方法),利用的就是原型链

属性问题

  1. 读取对象的属性时:会自动去原型链中查找
  2. 设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性。并且添加值
  3. 方法一般定义在原型中,属性一般通过构造函数定义在对象本身上
function Fn() {}
Fn.prototype.a = 'xxx'

const fn1 = new Fn()
console.log(fn1.a) // xxx

const fn2 = new Fn()
fn2.a = 'yyy'
console.log(fn1.a) // xxx

SunSeekerX
150 声望7 粉丝

这条路才刚刚开始啊~