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属性
//所以有个疑问就是没有声明的属性也可以去原型里找吗
//不是应该声明没赋值才有用么
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你的问题在于在构造实例时没有声明
name
,因为根本没有为构造函数传参数,那么真是如此吗?可以看到,即使没有给一个带参的函数传参,也能访问到这个参数,这个参数的值是
undefined
。这其实涉及到
arguments
,js函数定义时的参数其实是不必要的,因为函数内部其实访问的是一个类数组对象arguments
,传进来的参数依次放到这个对象中。所以第一个构造函数没有声明和初始化
name
,实例去原型中找name属性。但剩下的两个构造函数为name
赋值undefined
。所以这道题的答案是:
Tomundefinedjohn
。来自JavaScript高级程序设计(第三版)
MDN上的例子
C1,if不成立,new C1()中没有name属性,就访问到了原型上的name,输出tom
C2,既然没有参数,也就是执行new C2(undefined),所以name为undefined
C3,new C3()的name值为john,所输出john
proto