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

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属性

//所以有个疑问就是没有声明的属性也可以去原型里找吗

//不是应该声明没赋值才有用么


拉莫斯之舞
浏览 1303回答 2
2回答

斯蒂芬大帝

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

哈士奇WWW

你的问题在于在构造实例时没有声明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。
打开App,查看更多内容
随时随地看视频慕课网APP