
忽略该图的细节(如内存地址值没有用二进制)
以下是对该图进一步的理解和总结
1. JS对象概念的辨析
-
对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁)
-
明确Object也是JS默认执行的, 可以理解为
var Object = new Object()
是JS默认执行的 -
明确Function 也是对象
js可以这样理解 `var Function = new Object()` 是JS默认执行的
-
明确任何一个函数也是一个对象(即我们所说的类型对象(类型对象 就是用
function fn(){}
创建出来的函数对象),与之对应的实例对象 就是指通过调用构造方法new 创建的对象或者说直接用{}创建的对象(本质也是调用构造函数))js/** 如何理解任何一个函数也是一个对象**/ // 1. 函数不光可以用function关键字创建也可以用如下方法创建 var fn = new Function(); // 等同于 function fn(){} // 2. Function 也是对象,是这样来的 var Function = new Object(); // 3. Object() 是什么:构造方法(JS默认定义的)
2. JS原型对象的辨析
- 首先是一个对象
- 其次在代码中表现为:有一个属性其指向这个空对象(或者说是有一个变量,该变量储存该对象的地址)
3. JS隐式原型和显式原型的辨析
- 显式原型:即在函数中有一个属性叫prototype其指向一个空的对象(或者说这个属性的值保存这个空对象的地址值),这个属性就叫做显式原型对象(或者说这个属性保存的地址,通过该地址寻找到一个对象,该对象叫做显式原型对象)
- 隐式原型:对象中同样有一个属性叫__proto__其指向一个空的对象(或者说这个属性的值保存这个空对象的地址值),这个属性就叫做隐式原型对象(或者说这个属性保存的地址,通过该地址寻找到一个对象,该对象叫隐式原型对象)
- 【 需要注意的是 一般来说JS在创建对象的时候自动把__proto__指向其构造函数的prototype(也就是说会运行如下代码
__proto__ = prototype
) 这两个变量保存同一个空对象的地址】
- 【 需要注意的是 一般来说JS在创建对象的时候自动把__proto__指向其构造函数的prototype(也就是说会运行如下代码
通常我们会有一句话概括上面的内容:即一个对象(这里的对象是指实例对象)的隐式原型对象指向其构造函数(这里是指构造函数对象)的显式原型对象
4. Object 的原型对象中的__proto__
- 特殊的:明确 Object显式原型对象的__proto__(隐式原型对象)值为null,因为不为null 那就无限循环了(特殊情况)
5. 原型链查找
根据图以及1-4的铺垫,可以总结为,首先在该对象上找然后->找其隐式原型对象->一直往上找到那个__proto__为null的对象终止(期间找到了就返回,停止继续往上搜索)