f通过new关键词进行函数调用,之后无论如何都会返回一个与F关联的普通对象(因为不是通过函数构造创建的对象,所以不是函数对象,也就取不到b了

var F=function(){}; Object.prototype.a=function(){}; Function.prototype .b=function(){}; var f=new F();

关于这段代码的描述,正确的是:

A
f能取到a,但取不到b

B
f能取到a,b

C
F能取到b,不能取到a

D
F能取到a,不能取到b

正确答案:A

网上有一道美团外卖的面试题是这样的:
Function.prototype.a = 'a';
Object.prototype.b = 'b';
function Person(){};
var p = new Person();
console.log('p.a: '+ p.a); // p.a: undefined
console.log('p.b: '+ p.b); // p.b: b 问为什么?

有不少同学第一眼看上去就觉得很疑惑,p不是应该继承了Function原型里面的属性吗,为什么p.a返回值是undefined呢?
其实,只要仔细想一想就很容易明白了,
Person函数才是Function对象的一个实例,所以通过Person.a可以访问到Function原型里面的属性,
但是new Person()返回来的是一个对象,它是Object的一个实例,是没有继承Function的,所以无法访问Function原型里面的属性。
但是,由于在js里面所有对象都是Object的实例,所以,Person函数可以访问到Object原型里面的属性,Person.b => 'b'

这个问题涉及到js的原型继承

  1. f.proto ===
    f[的构造函数].prototype === F.prototype

  2. F.prototype.proto ===
    (F.prototype)[的构造函数].prototype === Object.prototype (所以a能够 通过f.a访问)

  3. f.constructor === F

  4. F.proto ===
    F[的构造函数].prototype === Function.prototype (所以b可以通过,
    f.constructor.b访问到)

注意:

(F.prototype)[的构造函数] === Object

F[的构造函数] === Function

多啰嗦一句( js 的继承靠的是__proto__,并不是prototype)

所有普通对象都源于这个Object.prototype对象,只要是对象,都能访问到a,
f通过new关键词进行函数调用,之后无论如何都会返回一个与F关联的普通对象(因为不是通过函数构造创建的对象,所以不是函数对象,也就取不到b了

最详尽的 JS 原型与原型链终极详解,没有「可能是」。(一)
https://www.jianshu.com/p/dee9f8b14771

var F=function(){};
var f=new F();
F.proto ==== Function.prototype;//true
f.proto ==== F.prototype;//true
F.prototype.proto === Object.prototype;//true
f继承的是F的prototype,所以说通过Function.prototype定义的属性相当于定义在F.proto上,可F.proto 与 F.prototype其实没什么关系。所以说f访问不到b,


__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/17832406.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示