计算机

JS 面向对象

原型

Javascript 不像 Python 或者 C++,天然地有类和对象的划分。JS 通过原型(prototype)来模拟面向对象的效果。

原型链

Javascript 的许多对象都有一个原型,除了最顶级的 Object.prototype,它是一切普通对象的原型。

通过 Object.GetPrototypeOf(my_object) 可以获得对象 my_object 的原型。

b 实例
 ↓
B.prototype
 ↓
A.prototype
 ↓
Object.prototype
 ↓
null

但不是所有的对象的原型链都经过 Object.prototype。所以,可以把 JS 的原型链看作一个图论上的森林,所有的原型为 null 的对象都是森林里一棵树的根节点。

类·对象·继承

一个类自动对应一个全部对象共享的原型,可以使用 类名.prototype 获得这个原型。通过类创建的对象,其原型就是 类名.prototype。

类的方法储存在 类名.prototype 里面,创建对象时,类方法不占用对象的空间。

发生类继承时,如果 B 是 A 的子类,会设置 B.prototype 的原型是 A.prototype。

一个对象查找属性或者调用方法时,如果在对象里找不到方法,会顺着原型链向上找,以原型链上找到的第一个属性或函数为准。通过这种方法 JS 模拟了继承的方法覆盖(overriding),因为子类的方法在原型链上会优先被找到。

类名 是一个不同于 类名.prototype 的对象,它本质上是一个函数对象。某种意义上可以把类名视为一个函数,调用它时自动返回一个新对象。但是,类名 不能直接通过括号调用,必须配合 new 关键字使用。

BEYOND THE ARTICLE

读完了,有什么想法?

阅读已保存的问答示例,并循着引用回到原文。

查看公开问答示例
— 本文完 — 返回文章列表