2009-06-26 16 views
1

Wert muss nicht zuString() zurückkehren, um value.toString() aufrufen zu können? Wann weißt du, dass du value.toString() aufrufen kannst?Wann ist es sicher, .toString() zu verwenden?

<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

Echte Fragen haben ein Verb und ein Fragezeichen – Eric

+0

Ich sagte "Muss Wert nicht zuString() zurückgeben, um value.toString() aufrufen zu können? Wann weißt du, dass du value.toString() aufrufen kannst? ". –

+1

Diese Frage hat wirklich nichts mit verknüpften Listen zu tun. –

Antwort

5
+0

Slick Antwort. Schnell, richtig und auf den Punkt gebracht. – rvighne

+1

Nein, nicht alle Objekte. null hat keine Eigenschaften. Auch undefined hat keine Eigenschaften, obwohl es kein Objekt ist. https://jsfiddle.net/bca30e5h/ – Aurimas

+0

@Aurimas 'null' ist nicht wirklich ein Objekt. Die JS-Spezifikation ist darüber verwirrt. Nullzeiger _lack_ ein Objekt. Siehe [this] (http://stackoverflow.com/a/18808300/7867) und andere Antworten auf diese Frage. –

0

document.write, wie window.alert, nennt seine Methode toString Argument, bevor er oder irgendetwas zurück schreibt.

5

Wie Mr. Shiny and New Staaten, alle JavaScript-Objekte haben eine Methode. Diese Methode ist jedoch nicht immer nützlich, insbesondere für benutzerdefinierte Klassen und Objektliterale, die Zeichenfolgen wie "[Object object]" zurückgeben.

Sie können Ihre eigenen toString Methoden erstellen, indem Sie eine Funktion mit dem Namen der Klasse Hinzufügen Prototyp, etwa so:

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

    // ... 
} 

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

Nun, wenn Sie einen new List(...) erstellen und rufen seine toString Methode (oder es laufen Durch eine beliebige Funktion oder einen Operator, der sie implizit in eine Zeichenfolge konvertiert), wird Ihre benutzerdefinierte -Methode verwendet.

schließlich zu erkennen, ob ein Objekt eine toString Methode hat für seine Klasse definiert (beachten Sie, dass dies nicht Arbeit mit Subclassing oder Objektliterale, das heißt für den Leser als Übung), können Sie den Zugriff auf constructor ‚s prototype Eigenschaft:

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

kleiner Tippfehler - ... toString = Funktion ... sollte ... toString: function ... sein – olliej

+0

Heh. Das tue ich auch im wirklichen Leben. Ich denke, das ist es, was ich bekomme, wenn ich in zu vielen verschiedenen Sprachen arbeite. :-) –

0

Andere Antworten sind richtig, dass toString auf allen Javascript-Objekte existiert.

Im Allgemeinen aber, wenn Sie wissen wollen, ob eine Funktion auf Ihrem Objekt vorhanden ist, können Sie es wie so testen:

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

Dies gilt natürlich nicht sicher, dass myMethod eine Funktion statt einer Immobilie. Aber vermutlich wirst du das wissen.

Verwandte Themen