Kailang Blog

Javascript 原型链2019-10-21Θ

对象划分#

对象分为不同对象和函数对象。ObjectFunction 是 Javascript 自带的函数对象。

总结#

  • 通过 new Function() 创建的都是函数对象;
  • Object 是通过 new Function() 创建出来的。

构造函数 Constructor#

定义一个 Book 构造函数:

book1 是 Book 的实例,它拥有一个 constructor 属性切指向 Book。

总结#

实例的构造函数属性指向构造函数。

原型对象 Prototype#

对象中包含预定义的属性。每个函数对象都有 prototype 属性,这个属性指向函数的原型对象。

总结#

  • 实例的构造函数属性(constructor)指向构造函数(PBook);
  • 原型对象(PBook.prototype)是构造函数(PBook)的一个实例。

原型对象其实就是普通对象。(Function.prototype 例外,是函数对象,但是它没有 prototype 属性):

使用#

  • 原型对象用于继承:

PBook.prototype 设置了一个函数对象的属性, PBook 的实例 pbook1 继承了这个属性。

注意#

  • typeof null === 'object'null 代表空指针(0x00),Object.prototype.toString.call(null) === '[object Null]'

proto#

对象的内置属性,用于指向创建它的构造函数的原型对象。标准在 ES6 中定制。

问题以及解答#

  • book1.__proto__

book1 的构造函数(Book)的 prototype 属性,即 Book.prototype

  • Book.__proto__

Book 的构造函数(Function)的 prototype 属性,即 Function.prototype

  • Book.prototype.__proto__

Book.prototype 是原型对象(普通对象)的构造函数(Object)的 prototype 属性,即 Object.prototype

  • Object.__proto__ Object 的构造函数(Function)的 prototype 属性,即 Function.prototype

  • Object.prototype.__proto__ 比较特殊, Object.prototype.__proto__ === null