Javascript 创建具有返回值的对象
我想知道这是否可行Javascript 创建具有返回值的对象,javascript,object,Javascript,Object,我想知道这是否可行 number = function(n){ var num = n; this.add = function(x){ return num + x; } return num; } alert(number(7)); //returns 7 seven = new number(7); alert(seven.add(3)); // returns 10 alert(seven); // want this to return 7, but
number = function(n){
var num = n;
this.add = function(x){
return num + x;
}
return num;
}
alert(number(7)); //returns 7
seven = new number(7);
alert(seven.add(3)); // returns 10
alert(seven); // want this to return 7, but will return [object Object]
我不需要数字(7)来返回7,但这会很好。要能够重用
数字,您需要在构造函数中返回对函数的引用:
var number = function(n) {
var num = n;
this.add = function(x){
return num + x;
};
this.value = function() {
return num;
};
}
为了能够重用编号
,您需要在构造函数中返回对函数的引用:
var number = function(n) {
var num = n;
this.add = function(x){
return num + x;
};
this.value = function() {
return num;
};
}
给它一个“toString”:
您还可以给它一个“valueOf”函数:
this.valueOf = function() { return num; }
这将让你做到:
alert(seven + 7); // 14
给它一个“toString”:
您还可以给它一个“valueOf”函数:
this.valueOf = function() { return num; }
这将让你做到:
alert(seven + 7); // 14
覆盖toString
:
number = function(n){
var num = n;
this.add = function(x){
return num + x;
};
this.toString = function(){
return num;
};
return num;
}
覆盖toString
:
number = function(n){
var num = n;
this.add = function(x){
return num + x;
};
this.toString = function(){
return num;
};
return num;
}
首先返回num代码>在代码中无效。函数返回的对象是this
。如果构造函数没有显式返回对象,它将始终隐式返回this
(请参阅中的步骤3)
也就是说,有两种方法可以覆盖,即和:
覆盖valueOf
的附加好处是JavaScript也会在内部调用该方法,将对象转换为原语值
例如,在普通加法中使用实例作为操作数也可以(而不是调用.add
):
也就是说,如果您只想为基本类型创建包装器,那么不要这样做
,则严格比较将失败(例如)。这是意料之中的,也是避免原语值的对象版本(Number
,String
,Boolean
)的原因之一(即“foo”==newstring(“foo”)
也是false
)。对象的行为与原语不同,混合使用这些原语会产生更复杂的代码。Firstreturnnum代码>在代码中无效。函数返回的对象是this
。如果构造函数没有显式返回对象,它将始终隐式返回this
(请参阅中的步骤3)
也就是说,有两种方法可以覆盖,即和:
覆盖valueOf
的附加好处是JavaScript也会在内部调用该方法,将对象转换为原语值
例如,在普通加法中使用实例作为操作数也可以(而不是调用.add
):
也就是说,如果您只想为基本类型创建包装器,那么不要这样做
,则严格比较将失败(例如)。这是意料之中的,也是避免原语值的对象版本(Number
,String
,Boolean
)的原因之一(即“foo”==newstring(“foo”)
也是false
)。对象的行为根本不像原语,混合使用这些原语会产生更复杂的代码。如果我说得对,你希望对象也像对象一样,除了传递给函数的时候?在您的示例中,变量seven
是一个对象,因此在任何地方引用时,它都不可能简单地返回7
而且,num
本质上是一个私有变量。因此,在
和JSON.stringify中使用for…对您没有任何好处。您应该做的是将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本机类型(字符串、数字、对象、函数等)冲突的名称
尽管如此,如果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中的闭包、对象和构造函数。如果我理解正确,您希望对象的行为也像对象一样,除非它被传递给函数?在您的示例中,变量seven
是一个对象,因此在任何地方引用时,它都不可能简单地返回7
而且,num
本质上是一个私有变量。因此,在
和JSON.stringify中使用for…对您没有任何好处。您应该做的是将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本机类型(字符串、数字、对象、函数等)冲突的名称
尽管如此,如果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中的闭包、对象和构造函数。您可能需要了解函数工厂模式:您希望既有一个数值,又有它的属性,例如。add
?让我想起pythons