假设我有一个函数 - 对象构造函数:
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时,是否可以使用点/括号表示法向构造函数添加更多属性?
答案 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])。