Javascript函数属性

Javascript函数属性,javascript,Javascript,为什么我可以在javascript中执行以下操作: function a() {}; a.foo = 30; 具体来说,为什么我可以在函数a上设置属性?毕竟,我不能这样做: var a = 20; a.foo = 30; 你真的不能这么做,因为这是一个语法错误 function a = function() {}; 我想你只是想说: function a() {} 无论如何。无法从数字中获取属性的原因是它不是真实对象 a = 20; a.foo = 30; // this works

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

function a() {};
a.foo = 30;
具体来说,为什么我可以在函数a上设置属性?毕竟,我不能这样做:

var a = 20;
a.foo = 30;

你真的不能这么做,因为这是一个语法错误

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
但是,如果它是字符串对象,则它会按预期工作:

a = new String("ohai");
a.foo = 30;   // this works
alert(a.foo); // this alerts 30
或者是数字对象。你明白了


字符串和数字文字在Javascript中不是对象。这就是原因。

在javascript中,函数是对象。或者它们继承自对象或其他东西

试着做

a = function(){};
alert(typeof a.prototype);
在JavaScript中,点()操作符希望它的左值是一个对象。在JavaScript中,函数是对象

基本上,在JavaScript中,有四种主要数据类型:

  • 布尔值
  • 反对
  • 对象包括函数、数组、日期对象和(没有更好的词)常规对象。函数对象是唯一的,因为它包含可执行代码,并且可以调用


    数字是原语,因此您无法访问/分配它们的属性。

    在Javascript中,函数是一个对象,因此您可以在其上设置属性:

    function a() {};
    a.foo = 30;
    a.foo; // evaluates to 30
    
    然而,数字文字创建的是一个基本值(没有属性),而不是一个对象

    在原语值上设置属性时,实际上是围绕原语值创建一个包装器对象,并在包装器对象上设置属性,而不是原语值

    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
    

    还有数组。。。它们与对象具有不同的本机原型(请注意,数组将返回一个typeof作为对象,但如果您检查其构造函数,您将看到它实际上是
    Array
    )。@Peter:不过,数组是对象。ECMA标准定义了“数组对象”、“函数对象”。。。和“Object objects”@Pumbaa-谢谢。这就解释了的类型。
    a.foo;                    // wrapper object created, has no foo property
    (new Number(a)).foo;      // --> equivalent, evaluates to undefined