【问题标题】:access/modify an object inside of a function | javascript访问/修改函数内部的对象 | javascript
【发布时间】:2016-07-15 11:38:15
【问题描述】:

假设我有一个函数 - 对象构造函数:

var constructor = function(name, surname, town){
    return {
        Name: name,
        Surname: surname,
        Town: town
    }
};

现在我可以像这样创建一个新的 obj:

var peter = constructor("Peter", "Jameson", "London");

我可以使用这样的点符号向我的新对象peter 添加新属性:

peter.phoneNumber = 856687;

我的问题是:当构造函数/函数中的对象没有 var 时,是否可以使用点/括号表示法向我的构造函数添加更多属性?

【问题讨论】:

  • 不清楚你在问什么。你的意思是修改constructor的代码,还是在运行时做点什么?
  • 仅供参考:species 未传递给函数。是的,请澄清你的问题。向我们展示您想要实现什么,您想如何使用单点/括号符号
  • 我想使用点符号(如果可能的话)修改构造函数的代码,例如我想为我的构造函数添加更多属性。如果代码是这样的: 'code' var constructor = function(name, surname, town){ v​​ar person = { Name: name, Surname: species, Town: town };返回人}; 'code' 那么我想我可以像这样修改我的构造函数: {constructor.person.phoneNumber = 554457;但在我原来的代码构造函数里面没有 var 所以我不能标记 obj
  • 嗯,不;如果你在构造函数中有一个var person,你也不能做constructor.person...。为什么要在 constructor 上执行此操作,而您应该将电话号码添加到 instance 似乎很明显?!
  • 顺便说一下,从术语上讲,你的函数更像是一个 factory 而不是 constructor - 通常“constructor”这个词应用于旨在使用new 调用。

标签: javascript function object


【解决方案1】:

听起来您正试图在运行时修改constructor 的行为。你说过:

我想使用点表示法修改构造函数的代码(如果在这种情况下可能的话),例如我想为我的构造函数添加更多属性。如果代码是这样的:

var constructor = function(name, surname, town){
    var person = { Name: name, Surname: species, Town: town };
    return person;
};

...那么我想我可以像这样修改我的构造函数:{constructor.person.phoneNumber = 554457; 但在我的原始代码构造函数中没有 var 所以我不能标记 obj

正如@deceze 指出的那样,不,即使constructor 中有一个变量,你也不能这样做;该变量对函数完全是私有的,它不会作为 constructor 的属性公开。

1 修改constructor 的行为在运行时的唯一方法是将其包装在一个新函数中,如下所示:

(function() {
    var original = constructor;
    constructor = function() {
        var obj = original.apply(this, arguments);
        obj.phoneNumber = 554457;
        return obj;
    };
})();

它使用它接收的所有参数(以及相同的this)调用原始版本,然后添加附加属性并返回它。


1 好的,技术上,你可以用toString 反编译它(在支持它的浏览器上;现在需要从 ES5 开始支持,所以非常好) ,使用文本操作来更改其内容,然后使用new Function 将其转回一个函数并将结果分配给constructor,但是A)这是一个非常糟糕的主意,并且B)该函数将失去其上下文,并且因此,如果它依赖于关闭任何非全局变量,它将停止工作(因此 [A])。

【讨论】:

  • 这是我一直在寻找的答案,谢谢!
猜你喜欢
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2022-09-29
  • 1970-01-01
  • 2017-09-20
  • 2023-03-15
相关资源
最近更新 更多