内容目录
js原型
教程地址:https://www.bilibili.com/video/av41708223?from=search&seid=2503409833258958402
总结:道生一,一生二,二生三,三生万物。(
Object
就是道,Object
的prototype
的对象就是道的终点,因为Object
的prototype
的对象隐式原型为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
原型继承
构造函数的实例对象自动拥有构造函数的属性(方法),利用的就是原型链
属性问题
- 读取对象的属性时:会自动去原型链中查找
- 设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性。并且添加值
- 方法一般定义在原型中,属性一般通过构造函数定义在对象本身上
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