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
)。对象的行为与原语不同,混合使用这些原语会产生更复杂的代码。

First
returnnum在代码中无效。函数返回的对象是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