logan70 / Blog

写博客的地方,觉得有用的给个Star支持一下~
81 stars 9 forks source link

原型和原型链 - 原型及JavaScript中的原型规则 #17

Open logan70 opened 4 years ago

logan70 commented 4 years ago

原型及JavaScript中的原型规则

原型与原型链

原型

JavaScript中,一个对象从被创建开始就和另一个对象关联,从另一个对象上继承其属性,这个另一个对象就是原型

获取原型的方法

  1. 可以通过Object.getPrototypeOf(obj)来获取obj的原型。
  2. 当然对象都是通过构造函数new出来的(字面量对象也可以这么理解),也可以通过访问对应构造函数的prototype属性来获取其原型。
const obj = {}
expect(Object.getPrototypeOf(obj) === Object.prototype).toBe(true)

原型链

当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去对象的原型(原型也是对象,也有它自己的原型)的原型上找,如此继续,直到找到为止,或者查找到最顶层的原型对象中也没有找到,就结束查找,返回undefined。这条由对象及其原型组成的链就叫做原型链

特殊原型规则

原型链顶层

普通对象可以理解为Object构造函数创建的,即普通对象的原型都指向Object.prototypeObject.prototype也是个对象,但是其原型比较特殊,为null,是原型链的顶层,切记!!!

expect(Object.getPrototypeOf({})).toBe(Object.prototype)
expect(Object.getPrototypeOf(Object.prototype)).toBe(null)

构造函数的原型

函数,包括构造函数都可理解为由构造函数Function创建,Function本身也不例外。

const getProto = Object.getPrototypeOf
const FuncProto = Function.prototype
expect(getProto(Function)).toBe(FuncProto)
expect(getProto(Object)).toBe(FuncProto)
expect(getProto(Number)).toBe(FuncProto)
expect(getProto(Symbol)).toBe(FuncProto)
expect(getProto(Array)).toBe(FuncProto)