深入理解JS原型与原型链
2012 年 12 月 31 日
函数的 prototype
1. 函数的 prototype 属性
* 每个函数都有一个 prototype 属性,它默认指向一个 Object 空对象 ( 即称为原型对 象 )
* 原型对象中都有一个属性 constructor ,它指向函数对象。
2. 给原型对象添加属性 ( 一般是方法 )
* 作用: 函数的所有实例对象自动拥有原型中的属性 ( 方法 )
显式原型与隐式原型
1. 每个函数 function 都有一个 prototype ,即显式原型 ( 属性 )
2. 每个实例对象都有一个 __proto__, 可称为隐式原型 ( 属性 )
3. 对象隐式原型的值为其对应构造函数的显式原型的值
4.内存结构图
5. 总结:
* 函数的 prototype 属性:在定义函数时自动添加,默认值是一个空 Object 对象
* 对象的 __proto__ 属性: 创建对象时自动添加的,默认值为构造函数的 prototype 属性值
* 程序员能直接操作显示原型,但不能直接操作隐式原型 (ES6 之前 )
原型链
* 访问一个对象的属性时,
* 先在自身属性中查找,找到返回
* 如果没有,再沿着 __proto__ 这条链向上查找,找到返回
* 如果最终没找到,返回 undefined
* 别名:隐式原型链
* 作用:查找对象的属性 ( 方法 ) ps: 查找变量的属性用 作用域链
1. 原型链(图解)
2. 构造函数 / 原型 / 实体对象的关系(图解)
function Foo(){ } 的本质是 var Foo = new Function()
而 Function = new Funtion()
( 只有这样 它自身的显式原型和隐式原型才是相等的 别的函数没有这个特点 )
实例对象的隐式原型属性 = 构造函数的显式原型属性
所有函数的隐式原型 __proto__ 都应该相等。都等于 Function.prototype
* 因为所有函数都是 new Function() 产生的。
3. 构造函数 / 原型 / 实体对象的关系 2 (图解)
原型链补充
1. 函数的显式原型指向的对象默认是空 Object 实例对象 ( 但 Object 不满足 )
2. 所有函数都是 Function 的实例 ( 包含 Funtion)