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

Why can't we add properties to a function object inside function body like we do for object literals in javascript?

看下面的代码

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

foo.prop2 = "value";

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

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

因为你用了分号。你用逗号来做。

正确的用法是:

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

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

Is there a different syntax to add properties to a function object directly in its body.

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

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

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

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

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

还是不行。它将导致:

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

foo() 将 return

{ prop1: 'value' }

foo.prop2 将 return 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 属性,在这种情况下它没有多大意义。