Javascript 原型
一图胜千言!
图片来源 - MollyPages.org
推导
-
Javascript 的世界里面 “函数是一等公民”
-
原型链的顶端是
Object.prototype,而它的原型是nullObject.getPrototypeOf(Object.prototype) === null // true -
所有函数对象(普通函数 + 构造函数)的原型都是
Function.prototypeObject.getPrototypeOf(String) === Function.prototype // true Object.getPrototypeOf(Number) === Function.prototype // true Object.getPrototypeOf(Boolean) === Function.prototype // true Object.getPrototypeOf(Object) === Function.prototype // true Object.getPrototypeOf(Array) === Function.prototype // true Object.getPrototypeOf(Function) === Function.prototype // true function A () {} // 构造函数 Object.getPrototypeOf(A) === Function.prototype // true function a () {} // 普通函数 Object.getPrototypeOf(a) === Function.prototype // true -
Function.prototype的原型是Object.prototypeObject.getPrototypeOf(Function.prototype) === Object.prototype // true -
Function也是一个函数,所以:Object.getPrototypeOf(String.prototype) === Object.prototype // true Object.getPrototypeOf(Number.prototype) === Object.prototype // true Object.getPrototypeOf(Boolean.prototype) === Object.prototype // true Object.getPrototypeOf(Object.prototype) === ? // 这里有个坑 Object.getPrototypeOf(Array.prototype) === Object.prototype // true Object.getPrototypeOf(Function.prototype) === Object.prototype // true function A () {} // 构造函数 Object.getPrototypeOf(A.prototype) === Object.prototype // true function a () {} // 普通函数 Object.getPrototypeOf(a.prototype) === Object.prototype // true上面有个坑,小心别趟!!!
-
实例的原型无需多言
-
字面量对象的原型是
Object.prototype
prototype 与 __proto__ 的区别
__proto__ 是隐式原型,用来查找原型链中实际原型对象的方法。
prototype 是显示原型,当创建一个对象的时候,用来构建 __proto__。
每一个对象都有 __proto__ 属性,只有函数才有 prototype 属性,除了通过 Function.prototype.bind 方法构造出来的函数。
NOTE Function objects created using Function.prototype.bind do not have a prototype property or the [[Code]], [[FormalParameters]], and [[Scope]] internal properties. ----- ECMAScript Language Specification
__proto__ 是非标准方法,虽然大部分浏览器都已经部署,但还是建议使用 Object.getPrototypeOf() 或 Reflect.getPrototypeOf() 方法获取对象原型。
这一张图太经典了~