1

これが可能かどうか知りたいのですが。

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を返すのにnumber(7)は必要ありませんが、それはいいことです。

4

5 に答える 5

7

まずreturn num;、コードに影響はありません。関数によって返されるオブジェクトはですthis。コンストラクター関数がオブジェクトを明示的に返さない場合、常に暗黙的に返されます( MDNドキュメントthisのステップ3を参照)。

とはいえ、オーバーライドできるメソッドは2つあります。つまり、toString [MDN]valueOf [MDN]です。

function MyNumber(n){
  this.num = n;
}

MyNumber.prototype.add = function(x){
    return this.num + x; // or `this + x` since we implemented `valueOf`
};

// Is called whenever the object has to be converted to a string
// e.g. alert(myNumber) ; myNumber + " is the answer to all questions"
MyNumber.prototype.toString = function() {
    return this.valueOf().toString(); // or `this.num.toString()`
};

// Is called whenever the object has to be converted to a primitive value
// e.g. myNumber + 42 ; myNumber == 42
MyNumber.prototype.valueOf = function() {
    return this.num;
};

上書きの追加の利点valueOfは、JavaScriptがこのメソッドを内部的にも呼び出して、オブジェクトからプリミティブ値に変換することです。

たとえば、通常の加算でオペランドとしてインスタンスを使用することも(を呼び出す代わりに.add)機能します。

> var n = new MyNumber(7);
> n + 10
  17

とはいえ、プリミティブ型のラッパーを作成したいだけの場合は、そうしないでください。

pimvdbが彼のコメントで述べているように、厳密な比較は失敗します(たとえば)。Numberこれは予想されることであり、プリミティブ値( 、、 )のオブジェクトバージョンを回避する理由の1つです(つまりString、同様です)。オブジェクトは単にプリミティブのように動作せず、これらを混合するとより複雑なコードが作成されます。Boolean"foo" === new String("foo")false

于 2012-06-09T13:54:34.203 に答える
4

「toString」を付けます。

number = function(n){

  var num = n;

  this.add = function(x){
    return num + x;
  }

  this.toString = function() {
    return num + "";
  };

  return num;

}

「valueOf」関数を指定することもできます。

  this.valueOf = function() { return num; }

それはあなたにできるでしょう:

alert(seven + 7); // 14
于 2012-06-09T13:54:02.717 に答える
2

再利用できるようにするNumberには、コンストラクターで関数への参照を返す必要があります。

var number = function(n) {

  var num = n;

  this.add = function(x){
    return num + x;
  };

  this.value = function() {
      return num;
  };
}
于 2012-06-09T13:52:40.933 に答える
1

オーバーライドtoString

number = function(n){

  var num = n;

  this.add = function(x){
    return num + x;
  };

  this.toString = function(){
    return num;
  };

  return num;

}
于 2012-06-09T13:54:21.510 に答える
1

私がこれを正しく理解した場合、関数に渡される場合を除いて、オブジェクトをオブジェクトとして動作させる必要がありますか?この例の変数はオブジェクトであるため、どこかで参照されたときにseven単純に戻る方法はありません。7

さらに、num本質的にはプライベート変数です。ですから、トリックを使ってfor...inJSON.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のクロージャー、オブジェクト、コンストラクターについて読みたいと思わずにはいられません。

于 2012-06-09T14:09:50.150 に答える