f
能取到a
,b
吗?原理是什么?
var F = function(){};
Object.prototype.a = function(){};
Function.prototype.b = function(){};
var f = new F();
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
f 的原型链:
F 的原型链:
f能取到a,b吗?
f能取到a,但取不到b
原理是什么?
一个对象能不能取得一个属性,首先在对象本身找,若本身没有就往上去它的原型对象里找,还没有就再往上一级原型对象里找,一直到root对象,就是Object或者Function。
针对这个题目中f,它是一个object (
typeof f)
,它的原型对象是f.__proto__
,但f.__proto__
里面没有a和b,所以继续往上找,typeof f.__proto__
=>'object',f.__proto__.__proto__
=> Object{}, Object里面有a。你可以验证一下
f.__proto__.__proto__.hasOwnProperty('a')
== true同理你可以在F里取到a和b。
f的原型链到Object.prototype结束
f->Object.prototype->没了
F为一个函数对象,同样也有原型链,其原型链的终点也是Object.prototype
F->Function.prototype->Object.prototype->没了
f(F的实例对象)能访问a
F(函数对象)能访问a,b
f
可以取到a
,F
可以取到a
,b
,可以看这个demo。原因:a方法是添加在
Object
上的,b
方法是添加在Function
上的,f
是一个Object
也是F
函数的引用,所以只可以取到a
,但是取不到b
;F
是Function
又是Object
所以两个都可以取到。@此刻最好 @fighterleslie @Chunwei 可以看下这个1楼回复http://segmentfault.com/q/1010000002736664
来自《Node.js 开发指南》
应该a b都可以访问吧
当然可以,Object是最顶级的,Object比Function还高一级,作为实例的f当然可以继承到a和b
很明显都可以啊,为什么和你们答案都不一样??
f.__proto__.__proto__.a()
f.constructor.constructor.b()
任何对象可以通过__proto__指到Object{}再指向null;任何函数通过constructor指向Function(),Function()的constructor是自己
var F = function(){};
Object.prototype.a = function(){console.log("this is a")};
Function.prototype.b = function(){console.log("this is b")};
var f = new F();
f.__proto__.__proto__.a();
f.constructor.constructor.b();
VM1230:3 this is a
VM1230:4 this is b