原型链
只要创建创建一个新函数,就会为该函数创建一个prototype
属性,这个属性指向函数的原型对象(prototype
), 这个属性是一个指向prototype
属性所在的函数指针
创建自定义构造函数之后,其原型对象只会默认取得constructor属性
当调用构造函数创建一个新实例后,该实例的内部包含一个指针(内部属性obj.__proto__
),指向构造函数的原型对象(Object.prototype
)
在ECMA-262第五版中管这个指针(__proto__
)叫做[[prototype]]
,[[prototype]]
是官方所定义的属性,而__proto__
是浏览器自己对[[prototype]]
作为对象的内部属性,根[[configurable]],[[writable]],[[enumerable]],[[value]]一样,外部无法直接访问
原型链的连接是存在实例与构造函数的原型对象之间,而不是存在实例与构造函数之间
Function.prototype.isPrototypeOf(fun1)
用于测试一个对象是否存在于另一个对象的原型链上
构造函数的prototype
与函数实例__proto__
都是指向函数的prototype
函数的[[prototype]]
的constructor
输出的是函数的源代码,指向函数名
原型链中恒定不变的规则
-
Object.prototype.__proto__ === null
-
FunCtion.prototype.__proto__ === Object.prototype
-
Function.prototype === fun.__proto__
-
Math,JSON的__proto__是Object.prototype
-
function a(){} 这样创建出来,没有继承关系的函数
a.prototype.__proto__ === Object.prototype
-
对象字面量和new Object()比如var a={}, b = new Object(); c=[]
__a.proto__ === a.constructor.prototype === Object.protype
a.__proto__.__proto__ === Object.prototype.__proto__ === null
-
基本数据类型string,number,boolean,比如var a ="",b = 10,c= false,
b.__proto__ === b.constructor.prototype === Number.prototype
b.__proto__.__proto__ === Number.prototype.__proto__ === Object.prototype
b.__proto__.__proto__.__proto__ === Object.prototype.__proto__ === null
-
null和undefined没有
__proto__
-
null和undefined没有
__proto__