typeof
1 | // from MDN |
instanceof
1 | function instanceOf(instance, constructor) { |
new
1 | function __new(constructor, ...args: any[]) { |
1 | // from MDN |
1 | function instanceOf(instance, constructor) { |
1 | function __new(constructor, ...args: any[]) { |
assign(target, ...sources)
,复制sources的自有可枚举属性到target,并返回target,复制过程用的是sources的[[Get]]与target的[[Set]];create(proto, propertiesObject)
,使用指定的原型对象和自有可枚举属性创建一个新对象;defineProperty(target, propName, descriptor)
,给target添加或修改名为propName的属性,并指定属性描述符;entries(target)
返回target的自有可枚举属性的键值对数组,形如[ ['propA', '1'], ['propB', 2] ]
;
定义的函数、类或对象会自动创建原型对象,并通过prototype
和constructor
互相指向对方,原型之间通过__proto__
构成原型链,实例调用某个方法时,会沿原型链寻找该方法,直到找到指定方法,或遍历完整个原型链后抛出异常;
借助单链表理解:针对实例调用某方法的角度来讲,原型链可以看作一个链表,每个节点都是原型对象,以__proto__
属性指向下一节点,头节点是实例本身,尾节点是Object.prototype
;
不同情况下的__proto__
如下:
__proto__
一定是Function.prototype
,包括Function
;
JS 引擎只确保 Execution Context 描述的机制,但不确保采用什么手段去实现。
首先,Execution Context 是 ECMAScript 语言规范中的抽象概念,它旨在建立一种易于描述和实现的 ECMAScript 运行机制,JavaScript 是 ECMAScript 的一种实现,而 JavaScript 引擎,例如 V8、SpiderMonkey、Carakan 等,在实现 JavaScript 运行环境时,并不一定会采用固定方式实现 Execution Context,更不会强调哪些类、方法或函数是与 Execution Context 有关的,也许其实现有关的代码到处都是。
但了解 Execution Context 仍然是有意义的,概念可以帮助我们理解现象。