Javascript函数属性
为什么我可以在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
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