如果我做对了,你希望一个对象表现得像一个对象,除非它被传递给一个函数?您示例中的变量seven
是一个对象,因此在7
任何地方引用它时都不会简单地返回。
更num
重要的是,本质上是一个私有变量。所以使用for...in
和JSON.stringify
欺骗对你没有任何好处。您应该做的是将num
变量设为对象属性 ( this.num
) 或创建成员函数 ( this.getNum(){return num};
)。
之后,您可以自由使用该属性/方法:
alert(seven.num);//alerts 7, but requires num to be declared as a property
alert(seven.getNum());//alerts 7, requires the method
我建议在这种情况下使用一种方法,因为您显然将此函数用作构造函数和常规函数(我可以补充一下,这不是一个好主意)。
稍微有点迂腐的说明:习惯于将构造函数的第一个字母大写,并且不使用可能与 JS 原生类型(字符串、数字、对象、函数...)冲突的名称
function MyNumber(n)
{
this.num = n;//as a property
this.add = function(x)
{
return this.num + x;
}
}
var seven = new MyNumber(7);
alert(seven.num);//alerts 7
不过,如果 num 不应该被改变——我猜这里就是这种情况——一个额外的功能是我要采取的路线:
function MyNumber(n)
{
var num = n;
this.add = function(x)
{
return num + x;
};
this.getNum = function()
{
return num;
};
}
alert(seven.getNum());
如果您仍打算将构造函数用作常规函数,则最好检查函数/构造函数的调用方式:
function MyNumber(n)
{
var num = n;
if (!(this instanceof MyNumber))
{//not called as constructor
return num;//or a function, or something else (treat this as a closure)
}
//Same code as above goes here
}
我在这里可能有点跑题了,但我不禁认为您可能想阅读 JavaScript 中的闭包、对象和构造函数。