「Learning」JavaScript中原型和原型链深入理解
Learning Card
- 辅助概念
- 函数
- 函数对象
- 本地对象
- 内置对象
- 宿主对象
- 原型和原型链
prototype
__proto__
笔记
辅助概念
函数
- 类型
- 函数声明
- 函数表达式
- 共同点
typeof
检测结果都是function
函数对象
函数就是对象,代表函数的对象就是函数对象
语法上,每一个函数实际上都是一个函数对象
用法上,通过函数来实例化出对象来使用
在面向对象的范畴里,函数对象类似于类的概念
本地对象(native object)
独立于宿主环境的ECMAScript实现提供的对象
包括:
Object, Function, Array, String, Boolean, Number, Date, RegExp, Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError
- 本地对象就是类(引用类型)
- 使用
typeof
检测结果都是function
内置对象
由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现。
- 开发者不必明确实例化内置对象,它已经被实例化了
- 包含
Global
和Math
- 每个内置对象都是本地对象
原型和原型链
prototype
prototype
是每一个函数都有的属性,但不是每一个对象都有的属性- 用于把共享的属性放到父类的实例中去(一改皆改)
__proto__
__proto__
是每一个对象和函数都隐含的属性- 它指向创建它的构造函数的
prototype
- 原型链就是通过这个属性构建的
我的理解:
- 父类的
prototype
属性用来保存所有实例需要共享的属性和方法- 实例用
__proto__
属性来继承父类原型上的属性和方法最核心的就是要记住一个公式
Father.prototype = Son.__proto__
这可以说是原型链第一大定律了!!!
我们可以通过一个例子来巩固这个知识点。
我们已知有A
和B
两个构造函数,A
的prototype
是另一个函数对象B
构造出的实例,我们可以尝试把它们连接起来:
1 | function A() {...}; |
- JS中万物皆对象,函数也是一种对象
- JS中的所有东西都由
Object
衍生而来,所有东西的原型链的重点都指向Object.prototype
- JS对象都由一个隐藏的
__proto__
属性,指向创建它的构造函数的原型;有一个例外是Object.prototype.__proto__
指向null
Function
与Object
的原型关系
- 构造函数是通过
Function
构造出来的,Function
也是通过Function
构造出来的,所以**Function.prototype === Function.__proto__
** Object
也是通过Function
构造出来的,所以**Object.__proto__ === Function.prototype
**Function.prototype
也是对象,也可以通过Object
创建出来,所以,**Function.prototype.__proto__ ===Object.prototype
**
关系备忘:
Father.prototype === Son.__proto__
Grandgrand...father.__proto__ === Object.prototype
Object.prototype.__proto__ === null
Function.prototype === Function.__proto__
Function.prototype ===Object.__proto__
Function.__proto__ === Object.__proto__
Function.prototype.__proto__ === Object.prototype