-
Notifications
You must be signed in to change notification settings - Fork 8
Open
Labels
Description
原型及JavaScript中的原型规则
原型与原型链
原型
JavaScript中,一个对象从被创建开始就和另一个对象关联,从另一个对象上继承其属性,这个另一个对象就是原型。
获取原型的方法
- 可以通过
Object.getPrototypeOf(obj)来获取obj的原型。 - 当然对象都是通过构造函数
new出来的(字面量对象也可以这么理解),也可以通过访问对应构造函数的prototype属性来获取其原型。
const obj = {}
expect(Object.getPrototypeOf(obj) === Object.prototype).toBe(true)原型链
当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去对象的原型(原型也是对象,也有它自己的原型)的原型上找,如此继续,直到找到为止,或者查找到最顶层的原型对象中也没有找到,就结束查找,返回undefined。这条由对象及其原型组成的链就叫做原型链。
特殊原型规则
原型链顶层
普通对象可以理解为Object构造函数创建的,即普通对象的原型都指向Object.prototype,Object.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)