2017-09-29 12 views
3

私は関数を呼び出した文字列を返そうとしています。偽の場合、プロトタイプからの入力を返す方法

しかし、文字列を返しません...配列を返します。

String.prototype.testing = function testing() { 
 
    if (this === "what") {} 
 
    return this //Should return - this is a string 
 
} 
 

 

 
x = "this is a string" 
 

 
y = x.testing() 
 

 
console.log(y)

+0

? –

+0

xは関数を呼び出すものです...これはxとは考えられていませんか? –

+0

xは「これは文字列です」 –

答えて

9

JavaScriptがStringオブジェクトと文字列プリミティブの両方を持っています。緩いモードのString.prototypeメソッドでは、thisは文字列オブジェクトです。 console.logから見ているものは配列ではなく、その特定のconsoleの実装が文字列プリミティブではなくStringオブジェクトを出力する方法です:

console.log(new String("hi"));

コードのバグは、しかし、があります:"what"は原始文字列ですが、thisStringオブジェクトであり、=== ISN」のでthis === "what"は、looseモードで真なることはありません許される強制。 this.toString() === "what"またはthis == "what"が必要です。おそらく、ifに添付されたブロックで何かしたいと思うでしょう。 thisを返すときに文字列プリミティブを返す場合は、末尾にreturn this.toString();が必要な場合があります。

例えば、のようなもの:

String.prototype.testing = function testing() { 
 
    if (this == "what") { 
 
    return "it was what"; 
 
    } 
 
    return this.toString(); 
 
}; 
 

 
var x = "this is a string"; 
 
var y = x.testing(); 
 
console.log(y); 
 
x = "what"; 
 
y = x.testing(); 
 
console.log(y);

またはstrictモードを使用して、このような何か:

"use strict"; 
 
String.prototype.testing = function testing() { 
 
    if (this == "what") { // Could still be either a primitive or object, depending 
 
    return "it was what"; 
 
    } 
 
    return this; // No need for toString here 
 
}; 
 

 
var x = "this is a string"; 
 
var y = x.testing(); 
 
console.log(y); 
 
x = "what"; 
 
y = x.testing(); 
 
console.log(y);

+0

@llama:良いキャッチ、私は "ドン!"瞬間数分前にその情報を編集していました。 –

+0

文字列プリミティブが不変であり、メソッドを追加できないからですか? – cygorx

+0

@cygorx:不変であるということは、メソッドを持つことができないというわけではありません。これは、文字列プリミティブが**プリミティブ**であるためです。プリミティブにはメソッドがありません。 JavaScriptエンジンによる特別な扱いのために思えます:プリミティブのメソッドを呼び出すとき(またはその上の非本質的なプロパティを調べるとき)、エンジンはプリミティブをオブジェクトにプロモートし、プロパティ/メソッドを探します(メソッドの場合)は、 'this'をプリミティブ(strictモードで)またはオブジェクト(looseモードで)に設定してメソッドを呼び出します。 –

-1

あなたが持っています...ないバグではなく、あなたがそれを割り当てるときに、関数名を追加する必要がここに、ありません。

String.prototype.testing = function **testing**() {} 

あなたのコードと間違って何かが必ずしもありませんが、あなたは、あなたが期待するものを見ていない:)

Foをたとえconsole.log(x)console.log(x.testing())と異なるように見えても、x == x.testing()のものを使用した例です。

これは同じですがタイプが異なります.1つは文字列プリミティブです.T.Jが投稿している間にうまく説明されています:)。 `this`が文字列であると定義されて

String.prototype.testing = function() { 
 
     if (this === "what") {} 
 
     return this.toString(); 
 
    } 
 

 

 
    x = "this is a string" 
 

 
    y = x.testing() 
 

 
    console.log(y)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+1

正解ですが、あなたは説明を追加することができますか? –

+0

@ T.J。 Crowderは以下に非常にうまく説明しました:) – bluehipy

関連する問題