Javascript函数属性

时间:2010-09-08 23:22:47

标签: javascript

为什么我可以在javascript中执行以下操作:

function a() {};
a.foo = 30;

具体来说,为什么我可以在函数a上设置属性?毕竟,我不能这样做:

var a = 20;
a.foo = 30;

4 个答案:

答案 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中,有四种主要的数据类型:

  1. 数字
  2. 字符串
  3. 布尔
  4. 对象
  5. 对象包含函数,数组,日期对象和(缺少更好的单词)常规对象。函数对象的独特之处在于它包含可执行代码,并且可以调用

    数字是基元,因此您无法访问/分配属性。

答案 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);