访问/修改函数内部的对象JavaScript的

时间:2016-07-15 11:38:16

标签: javascript function object

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

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时,是否可以使用点/括号表示法向构造函数添加更多属性?

1 个答案:

答案 0 :(得分: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])。