为什么我可以在javascript中执行以下操作:
function a() {};
a.foo = 30;
具体来说,为什么我可以在函数a上设置属性?毕竟,我不能这样做:
var a = 20;
a.foo = 30;
答案 0 :(得分:6)
你真的不能这样做,因为它是语法错误
function a = function() {};
我想你只想说:
function a() {}
反正。您无法从数字中获取属性的原因是它不是真正的对象。
a = 20;
a.foo = 30; // this works
alert(a.foo); // this alerts nothing
信不信由你,字符串也是如此:
a = "ohai";
a.foo = 30; // this works
alert(a.foo); // this alerts nothing
但是如果它是String对象,那么它按预期工作:
a = new String("ohai");
a.foo = 30; // this works
alert(a.foo); // this alerts 30
或者如果它是一个Number对象。你明白了。
字符串和数字文字不是Javascript中的对象。这就是原因。
答案 1 :(得分:4)
在JavaScript中,点(。)运算符期望它的左值为对象。在JavaScript中,函数是对象。
基本上,在JavaScript中,有四种主要的数据类型:
对象包含函数,数组,日期对象和(缺少更好的单词)常规对象。函数对象的独特之处在于它包含可执行代码,并且可以调用。
数字是基元,因此您无法访问/分配属性。
答案 2 :(得分:2)
在Javascript中,函数是一个对象,因此您可以在其上设置属性:
function a() {};
a.foo = 30;
a.foo; // evaluates to 30
数字文字会创建原始值(没有属性)而不是对象。
a = 20; // Create primitive value using number literal
在原始值上设置属性时,实际上是在原始值周围创建包装器对象,并在包装器对象上设置属性,而不是原始值。
a.foo = 30; // wrapper object created and directly thrown away
(new Number(a)).foo = 30; // --> equivalent
当您阅读该属性时,再次创建一个包装器对象,该对象没有定义属性。
a.foo; // wrapper object created, has no foo property
(new Number(a)).foo; // --> equivalent, evaluates to undefined
答案 3 :(得分:0)
在javascript函数中是对象。或者他们从对象或其他东西继承。
尝试做
a = function(){};
alert(typeof a.prototype);