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
读完了,有什么想法?
阅读已保存的问答示例,并循着引用回到原文。
— 本文完 — 返回文章列表