Javascript 原型总结

prototype

prototype 是一个显式声明的原型属性,只有函数拥有,除了通过 bind 创建的函数。默认它只有一个属性 constructor 指向构造函数,即:

const fun = function() {}
fun.prototype.constructor === fun // true

__proto__

每个对象都有一个 __proto__ 属性,指向它构造函数的原型,即:

function Fun() {}
const fun = new Fun();
fun.__proto__ === Fun.prototype;

函数对象?

函数对象与其他用户所定义的对象有着本质的区别,这一类对象被称之为内部对象,例如:

  • Function
  • Object
  • Array
  • String
  • Number
  • RegExp
  • Date

这些内置对象的构造器是由 JavaScript 本身所定义的,通过 [native code] 来初始化返回的对象,而不是由用户来指定对象的构造方式。

Array.__proto__
// f() { [native code] }
Object.__proto__
// f() { [native code] }
Function.__proto__
// f() { [native code] }

Function 和 Object

函数对象都是 Function 自身的实例

Function.__proto__ === Function.prototype
Object.__proto__ === Function.prototype

同时 Function 也继承自 Object

Function.__proto__.__proto__ === Object.prototype
Array instanceof Object // true

原型链的终点是 null

Object.prototype.__proto__ === null

关于原型链的一切看这张图就好了