为了账号安全,请及时绑定邮箱和手机立即绑定

f 能取到a,b 吗?原理是什么?var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = function(){}; var f = new F();

f 能取到a,b 吗?原理是什么?var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = function(){}; var f = new F();

o巧克力o 2015-09-02 11:44:31
Function、Object——Js自带的函数对象。new的过程拆分成以下三步:1、 var f={}; 也就是说,初始化一个对象p。2、 f.__proto__=F.prototype;3、 F.call(f);也就是说构造p,也可以称之为初始化p。console.log(f.__proto__===F.prototype);  // 返回值为true,证明第2点console.log(F.__proto__===Function.prototype);  // 返回值为trueconsole.log(F.prototype.__proto__===Object.prototype);  // 返回值为true重点部分:console.log(f.__proto__.__proto__===Object.prototype);  // 返回值为true那么__proto__是什么?我们在这里简单地说下。每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。首先var F = function(){}; 可以得出 f.__proto__=F.prototype。那么当我们调用 f.a 或者 f.b 时,首先 f 中没有 a 或者 b 这个属性, 于是,他就需要到他的__proto__中去找,也就是F.prototype,由于F.prototype中也没有 a 或者 b ;那就去 f.__proto__.__proto__找,也就是Object.prototype中去找,于是就找到了a这个属性。说白了 这就是原型链的实现原理。最后,我个人认为,其实prototype只是一个假象,它在原型链实现中只是起到了一个辅助作用,换言之,它只是在new的时候有着一定的价值,而原型链的本质,其实在于__proto__!
查看完整描述

3 回答

?
qq_戭饰_0

TA贡献1条经验 获得超0个赞

var F = function(){}; Object.prototype.a = function(){}; F.prototype.b = function(){}; var f = new F(); 才可以取到 a b
查看完整回答
反对 回复 2018-07-04
?
麻三

TA贡献1条经验 获得超0个赞

调用不了f.b()

查看完整回答
反对 回复 2016-02-22
?
o巧克力o

TA贡献1条经验 获得超0个赞

自己总结 望各位大神不吝赐教

查看完整回答
反对 回复 2015-09-02
  • wait_hua
    wait_hua
    我测试的是f能去到a,但是取不到b,这是为什么?
  • 3 回答
  • 1 关注
  • 4271 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信