.toString()を使用することが安全である場合には?
-
20-08-2019 - |
質問
は値がvalue.toStringを(呼び出すことができるようにtoString()を返す必要はありませんか)?ときあなたはvalue.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>
他のヒント
氏として光沢があり、新しいの状態は、のすべてののJavaScriptオブジェクトはtoString
方法を持っています。しかし、その方法は、特に"[Object object]"
のような文字列を返す傾向にあるカスタムクラスとオブジェクトリテラル、のために、常に有用ではありません。
あなたはそうのように、あなたのクラスのプロトタイプにその名前の関数を追加することで、独自のnew List(...)
メソッドを作成することができます
function List(val, list) {
this.val = val;
this.list = list;
// ...
}
List.prototype = {
toString: function() {
return "newList(" + this.val + ", " + this.list + ")";
}
};
さて、あなたはconstructor
を作成し、カスタムprototype
方法が使用され、その<=>メソッドを呼び出します(または暗黙的に文字列に変換する関数や演算子を介して実行)。場合は、
最後に、(;それは読者のための課題として残され、これはサブクラスまたはオブジェクトリテラルとの のない動作することに留意されたい)オブジェクトは、そのクラスに定義<=>方法を持っているかどうかを検出します、あなたはその<=>の<=>プロパティにアクセスすることができます:
if (value.constructor.prototype.hasOwnProperty("toString")) {
alert("Value has a custom toString!");
}
のdocument.writeは、のwindow.alertのように、その引数のtoStringメソッドを呼び出します。
他の回答はtoString
は、すべてのJavascriptのオブジェクトの上に存在していることが正しいです。
あなたが関数は、オブジェクト上に存在するかどうかを知りたい場合は一般的に、しかし、あなたはそのようにそれをテストすることができます:
if (obj.myMethod) {
obj.myMethod();
}
これは、当然のことながら、代わりにプロパティの機能がmyMethod
であることを保証しません。しかし、おそらくあなたはそれを知っているよ。