var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = function(){}; var f = new F();
问:能否通过f取到方法a,方法b?
这里我画了一张图:
f是F的实例对象,实例对象继承构造函数原型对象,constructor属性是原型对象特有的,所以,f也具有contructor属性,f.constructor === F.prototype.constructor
而F.prototype.constructor === F。
可以看出f继承F.prototye,而F.prototype则继承Object.prototype,所以f继承了a方法,而取不到b方法;
但是F继承了Function.prototype,又向上继承了Obejct,所以继承a,也继承b;
constructor是每个原型对象拥有的属性,指向构造函数本身,题目中f是F的实例对象,实例对象继承原型对象属性,f.constructor === F.prototype.constructor
所以可以通过f.constructor.a获取a方法,f.constructor.b获取b方法,当然也可以直接f是可以直接调用a方法的。
PS:instanceof就是用来检测当前对象是否在原型链上的关键字
上面:f instanceof F //true
console.log('1',f.constructor === F) //1 true console.log('2',f.__proto__ === F.prototype) //2 true console.log('3',F.prototype.__proto__ === Object.prototype) //3 true console.log('4',F.constructor === Function) //4 true console.log('5',F.__proto__ === Function.prototype) //5 true console.log('6',Function.prototype.__proto__ === Object.prototype) //6 true console.log('7',f.a === Object.prototype.a) //7 true console.log('8',f.constructor.a === Object.prototype.a) //8 true console.log('9',f.constructor.b === Function.prototype.b) //9 true
【完】
应无所住而生其心 ——《金刚经》