为什么我们不能像在javascript中为对象文字那样向函数体内的函数对象添加属性?

时间:2015-03-27 04:13:00

标签: javascript javascript-objects

查看下面的代码

var foo = function(){
    prop1 : "value";
}

foo.prop2 = "value";

console.log("prop1" in foo)    // logs flase
console.log("prop2" in foo)    // logs true

为什么我们不能像在对象文字中那样向函数对象添加属性?为什么我要在其体外声明函数对象的属性?是否有不同的语法直接在函数体中添加属性。

3 个答案:

答案 0 :(得分:3)

那是因为javascript中的函数语法不允许它。你需要的只是一个普通的对象。

  

是否有不同的语法来向函数对象添加属性   直接在它的身体里。

是。有。它被称为构造函数。

function Foo(){
    this.prop1 = "value";
}
var obj = new Foo();
console.log(obj.prop1);

答案 1 :(得分:0)

你使用类似于CoffeeScript的东西吗?你忘记了对象上的{}

首先我建议你回复一个合适的对象:

var foo = function(){
    { prop1 : "value" };
}

仍然无效。这将导致:

foo.prop2 = "value2";
{ [Function] prop2: 'value2' }

foo()将返回

{ prop1: 'value' }

foo.prop2将返回value2

它不起作用的原因是因为您要添加到实例。不是函数体(你不能改变代码,只能改变对象。)。

更好的解决方案是:

var newFoo = foo()
{ prop1: 'value' }
newFoo.prop2 = "value2";
{ prop1: 'value', prop2: 'value2' }

正如我们所见,你可以修改它的功能,但是你不能修改它的return语句,因为它需要软件重写函数而我们还不是天网......但是。 ; d

修改内容的另一个有趣方法是原型设计:

Function.prototype.prop2 = "value2"
foo()
{ prop1: 'value' }
foo.prop2
'value2'

但是看到Function.prototype会使每个函数获得.prop2属性,在这种情况下它没有多大意义。

答案 2 :(得分:-3)

因为你使用过半结肠。你用逗号来做。

正确使用将是:

var foo = {
    prop1 : "value",
    prop2 : "value"
}