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

面试遇到的一个问题,小白求教关于原型链的

面试遇到的一个问题,小白求教关于原型链的

拉莫斯之舞 2018-08-02 13:24:52
function C1(name){    if(name) this.name=name;}function C2(name){    this.name=name;}function C3(name){    this.name=name||'john';}//C1.prototype.name="Tom";C2.prototype.name="Tom";C3.prototype.name="Tom";alert((new C1().name)+(new C2().name)+(new C3().name));//我理解的本地name都没声明,访问的都是prototype的name属性//所以有个疑问就是没有声明的属性也可以去原型里找吗//不是应该声明没赋值才有用么
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

C1,if不成立,new C1()中没有name属性,就访问到了原型上的name,输出tom
C2,既然没有参数,也就是执行new C2(undefined),所以name为undefined
C3,new C3()的name值为john,所输出john

查看完整回答
反对 回复 2018-08-05
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

你的问题在于在构造实例时没有声明name,因为根本没有为构造函数传参数,那么真是如此吗?

function test(t) {    
        console.log(t);//undefined
    console.log(a);//报错}
test();

可以看到,即使没有给一个带参的函数传参,也能访问到这个参数,这个参数的值是undefined
这其实涉及到arguments,js函数定义时的参数其实是不必要的,因为函数内部其实访问的是一个类数组对象arguments,传进来的参数依次放到这个对象中。

function test(t) {    
        console.log(arguments[0]);//undefined
    console.log(arguments[1]);//undefined}
test();

所以第一个构造函数没有声明和初始化name,实例去原型中找name属性。但剩下的两个构造函数为name赋值undefined
所以这道题的答案是:Tomundefinedjohn


查看完整回答
反对 回复 2018-08-05
  • 2 回答
  • 0 关注
  • 1301 浏览
慕课专栏
更多

添加回答

举报

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