2016-07-15 53 views
0

可以说我有一个功能 - 对象构造:访问/修改函数内部的对象| JavaScript的

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时?

+2

目前还不清楚你在问什么。你的意思是修改'constructor'的代码,或者在运行时做一些事情? –

+0

供参考:'物种'没有传递给函数。是的,请澄清你的问题。向我们展示你想做什么,你想如何使用单点/括号表示法 – vaso123

+0

我想用点表示法(如果可能的话)修改构造函数的代码,例如我想添加更多的属性给我的构造函数。如果代码是这样的: '代码' 变种构造函数=(姓名,镇){VAR 人= { 名称:名称, 姓:种, 镇:镇 }; return person }; 'code' 那么我想我可以修改我的构造函数,如下所示: {constructor.person.phoneNumber = 554457; 但在我原来的代码构造函数里面没有var所以我不能taget obj – Ziggy

回答

1

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

我想用点符号(如果可能的话)修改构造函数的代码,例如我想添加更多的属性给我的构造函数。如果代码是这样的:

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

...然后我想我可以改变我的构造是这样的:{constructor.person.phoneNumber = 554457;但在我的原代码,构造函数有没有变种里面,所以我不能taget OBJ

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

在运行时修改constructor的行为的唯一途径是包装在一个新的功能,如:

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

与所有的参数调用原始的版本,它收到(和相同的this),然后添加额外的属性,并将其返回。


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

+0

这是我一直在寻找的答案,谢谢! – Ziggy

相关问题