在学习js高社的第4章的时候,有一段动态属性总结:我们只能给应用类型值动态地添加属性,而不能为基本数据类型添加属性。这时我想能不能动态的为函数、正则添加属性呢?已是写了一个测试例子:
var foo = function(){
}
foo.name = false;
console.log(foo.name);
结果是报undefined,也就是属性添加失败,我就感到不解,难道foo指向的不是应用类型嘛?那这不是和书上的结论有矛盾嘛。所以请求大牛指点我这个菜鸟。
ps:可以通过以下方式赋值属性。
//执行函数
var foo = function(){
foo.status = false;
}
foo();
console.log(foo.status);
或者
//实例化函数
var foo = function(){
//todo
}
var fooInstance = new foo();
fooInstance.status= false
console.log(fooInstance.status);
关键在于你选择了一个错误的属性名,javascript 中,每个 function 都会有一个内部属性,这个属性不可改变,比如
function hello() {}
console.log(hello.name)
// 输出 hello
但是你那个例子为什么没有输出呢……其实不是没有,而是输出了一个空字符串,因为你定义的是一个匿名函数,没有名字。
因为函数的名字不可被更改,所以你给 name
赋值虽然不报错,却也不起作用。
var foo = function(){
}
foo.test= false;
console.log(foo.test);
这段代码你就看得到效果了
补充
虽然
Function
对象的确是有一个不可改变的name
属性,但是我在 ECMAScript Language Specification 里没有找到相关的定义…… 如果有谁找到了,麻烦跟我说一声呵,谢谢。
晕死,你所谓的“报undefined”只不过是console.log(...)
的返回值是undefined
,难道你没看到在这个undefined
之前还输出了一个false
么?
这个明明是false嘛。。。
你把console.log
的返回值当成它的输出结果了。