1. 首先
2.
3. 实例对象的原型(我们以__proto__来表示)会指向其构造函数的prototype属性, 因此 Object.__proto__ === Function.prototype, Function.__proto__ === Function.prototype, Function.prototype.__proto__ === Object.prototype
4. 当我们访问一个属性值的时候, 它会沿着原型链向上查找, 直到找到或者到Object.prototype.__proto__(为null)截止.
Object
和
Function
都是构造函数,而所有的构造函数的都是
Function
的实例对象. 因此
Object
是
Function
的实例对象
2.
Function.prototype
是
Object
的实例对象
3. 实例对象的原型(我们以__proto__来表示)会指向其构造函数的prototype属性, 因此 Object.__proto__ === Function.prototype, Function.__proto__ === Function.prototype, Function.prototype.__proto__ === Object.prototype
4. 当我们访问一个属性值的时候, 它会沿着原型链向上查找, 直到找到或者到Object.prototype.__proto__(为null)截止.
假如我们有以下例子:
var foo = {},
F = function(){};
Object.prototype.a = 'value a';
Function.prototype.b = 'value b';
console.log(foo.a) // value a
console.log(foo.b) // undefined
console.log(F.a) // value a
console.log(F.b) // value b
那么
- foo.a的查找路径: foo自身: 没有 ---> foo.__proto__(Object.prototype): 找到value a
- foo.b的查找路径: foo自身: 没有 ---> foo.__proto__(Object.prototype): 没有 ---> foo.__proto__.__proto__ (Object.prototype.__proto__): 没有
- F.a的查找路径: F自身: 没有 ---> F.__proto__(Function.prototype): 没有 ---> F.__proto__.__proto__(Object.prototype): 找到value a
- F.b的查找路径: F自身: 没有 ---> F.__proto__(Function.prototype): 找到value b
4.关于instanceof的结果不要仅从字面上理解, 它的计算规则是: 如果右侧构造函数的prototype属性能在左侧的对象的原型链中找到, 那么就返回true, 否则就返回false
- Object intanceof Function: Object.__proto__ === Function.prototype, 因为结果为true
- Function instanceof Object: Function.__proto__.__proto__ === Object.prototype, 因为结果也为true
至于你说的, Object
和Function
互为实例对象是不对的,Object
是Function
的实例对象, Function.prototype
是Object
的实例对象。
5.实例对象的constructor属性指向其构造函数, 因此Object.constructor === Function, Function.constructor === Function.