原型
每个函数都有一个prototype属性,它默认指向一个Object对象(原型对象)说它是空的是因为它没有我们自己定义的属性,这个对象里只有constructor属性(指向这个函数对象),还有一个__proto__指向这个Object原型对象的原型对象。
函数的所有实例对象都自动拥有原型中的属性(方法)
实例对象的__proto__等于它的构造函数的prototype
原型链
总结
-
好多函数的声明比如function Fun(){}其实就是 var Fun = new Function();
-
实例对象寻找属性
- 先在自身属性中查找,找到返回
- 如果没有, 再沿着__proto__这条链向上查找, 找到返回
- 如果最终没找到, 返回undefined
-
设置对象的属性值时: 不会查找原型链, 如果当前对象中没有此属性, 直接添加此属性并设置其值
-
方法一般定义在原型中, 属性一般通过构造函数定义在对象本身上
-
其中的特例就是Function它自己构造自己
instanceof
instanceof的判断流程
- 表达式: A instanceof B
- 如果B函数的显式原型对象在A对象的(隐式)原型链上, 返回true, 否则返回false
一些易错的情况
console.log(Object instanceof Function);//true
console.log(Object instanceof Object);//true
console.log(Function instanceof Function);//true
console.log(Function instanceof Object);//true
function Foo() {
}
console.log(Object instanceof Foo);//false
下面来对应分条解释:
- Object构造函数本身也是对象,它的__proto__是Function构造函数的prototype
- Object构造函数的__proto__是Function构造函数的prototype,Function构造函数的原型对象的__proto__又是Object的构造函数的prototype
- 这里是特例Function = new Function(),Function的prototype和__proto__相等
- Function对象的__proto__是Function的prototype,Function的prototype的__proto__是Object的prototype