2009-06-26 11 views
1

value.toString()を呼び出すために値をtoString()に戻す必要はありませんか? value.toString()を呼び出すことができるのはいつ知っていますか?それは書き込んだり、何かを返す前に.toString()を使用するのはいつ安全ですか?

<script> 
var newList = function(val, lst) 
{ 
    return { 
    value: val, 
    tail: lst, 
    toString: function() 
    { 
     var result = this.value.toString(); 
     if (this.tail != null) 
     result += "; " + this.tail.toString(); 
     return result; 
    }, 
    append: function(val) 
    { 
     if (this.tail == null) 
     this.tail = newList(val, null); 
     else 
     this.tail.append(val); 
    } 
    }; 
} 

var list = newList("abc", null); // a string 
list.append(3.14); // a floating-point number 
list.append([1, 2, 3]); // an array 
document.write(list.toString()); 
</script> 
+0

実際の質問には動詞と疑問符が付きます – Eric

+0

「value.toString()を呼び出すには値をtoString()に戻す必要はありませんか?value.toString()を呼び出すことができることはいつ知っていますか? " –

+1

この質問はリンクされたリストとは関係ありません。 –

答えて

5
+0

スリックな答え。速く、正確で、ポイントまでまっすぐです。 – rvighne

+1

いいえ、すべてのオブジェクトではありません。 nullにはプロパティはありません。また、オブジェクトではありませんが、undefinedにはプロパティはありません。 https://jsfiddle.net/bca30e5h/ – Aurimas

+0

@Aurimas 'null'は実際にはオブジェクトではありません。 JSの仕様はこれについて混乱しています。ヌルポインタ_lack_オブジェクト。 [this](http://stackoverflow.com/a/18808300/7867)とその質問に対するその他の回答を参照してください。 –

0

のdocument.writeは、のwindow.alertのように、その引数のtoStringメソッドを呼び出します。

5

Mr. Shiny and New州、すべて JavaScriptオブジェクトにはtoStringメソッドがあります。しかし、このメソッドは、特にカスタムクラスやオブジェクトリテラルの場合は便利ではありません。文字列は"[Object object]"のように返されます。

あなたがそうのように、あなたのクラスのプロトタイプにその名前の関数を追加することで、独自のtoStringメソッドを作成することができます:あなたはnew List(...)を作成し、そのtoStringメソッドを呼び出します(または、それを実行した場合、今

function List(val, list) { 
    this.val = val; 
    this.list = list; 

    // ... 
} 

List.prototype = { 
    toString: function() { 
     return "newList(" + this.val + ", " + this.list + ")"; 
    } 
}; 

をそれを暗黙的に文字列に変換する関数または演算子を介して)、あなたのカスタムtoStringメソッドが使用されます。

最後に、オブジェクトは、そのクラスに定義toString方法を持っているかどうかを検出するために(これはサブクラスやオブジェクトリテラルでない作業することに注意してください。それは読者の課題として残されているが)、あなたがアクセスすることができ、そのconstructorさんprototypeプロパティ:

if (value.constructor.prototype.hasOwnProperty("toString")) { 
    alert("Value has a custom toString!"); 
} 
+0

マイナーなタイプミス... toString = function ... toString ... function ... – olliej

+0

Heh。私は本当の人生でもそうしています。あまりにも多くの異なる言語で働いているのはそういうことだと思います。 :-) –

0

他の回答はtoStringは、すべてのJavascriptのオブジェクトの上に存在していることが正しいです。

一般に

、あなたは関数は、オブジェクトに存在するかどうかを知りたい場合しかし、あなたはそうのようにそれをテストすることができます。

if (obj.myMethod) { 
    obj.myMethod(); 
} 

これは、もちろん、myMethodではなく関数であることを保証するものではありませんプロパティの。しかしおそらくあなたはそれを知っているでしょう。

関連する問題