2010-11-10 13 views
5

Mimo że dużo o tym przeczytałem, nie mogę się pogodzić z prototypową koncepcją.Prototypy w JavaScript

Dlaczego są String i String.prototype?

Jeśli mam "cat":

  • Czy to String lub Object?
  • Czy dziedziczy wszystkie właściwości/metody od String lub String.prototype?
  • Dlaczego są String i String.prototype?
  • Czy powinienem wywołać String obiektu String i String.prototype prototypu String?

Proszę o wyjaśnienie tego.

Odpowiedz

10

mam odpowiedzi na to, ponieważ nie ma dużo dezinformacji w temacie:

Czy ciąg lub obiekt?

nr"cat" jest wartością prymitywny String:

typeof "cat"; // "string", a String value 
"cat" instanceof String; // false 


typeof new String("cat"); // "object", a String object 
new String("cat") instanceof String; // true 

będę mówić później o rodzaju i wartości pierwotnych.

Czy dziedziczy wszystkie właściwości/metody z String lub String.prototype?

Cóż, kiedy używasz property accessor operator (kropka lub notacji uchwytem), wartość prymitywny jest niejawnie konwertowane do obiektu, wewnętrznie, dlatego wszystkie sposoby na String.prototype są dostępne, na przykład:

Kiedy dostęp:

"cat".chatAt(0); 

Za kulisami "cat" jest konwertowany do obiektu:

Object("cat").chatAt(0); 

To dlatego masz dostęp do wszystkich dziedziczonych właściwości wartości.

Dlaczego istnieje ciąg i string.prototyp?

String jest funkcją konstruktora, pozwala na tworzenie obiektów String czy typ konwersji:

var stringObj = new String("foo"); // String object 

// Type conversion 
var myObj = { toString: function() { return "foo!"; } }; 

alert(String(myObj)); // "foo!" 

Obiekt String.prototype, gdzie jest przedmiotem wystąpień obiektu String dziedziczyć.

Wiem, że to jest mylące, mamy wartości String i obiekty String, ale większość czasu pracujesz tylko z wartościami łańcuchów, nie martw się teraz o obiekty typu String.

Czy powinienem wywołać String the String object i String.prototype the String prototype?

Należy zadzwonić pod numer String"The String constructor".

"Prototyp strun" jest w porządku.

Powinieneś wiedzieć, że "Wszystko jest NOT obiektu".

Porozmawiajmy o rodzajów istnieje pięć language types określone: ​​

  • String
  • Ilość
  • Boolean
  • Null
  • Undefined

A primitive value to "baza danych reprezentowana bezpośrednio na najniższym poziomie implementacji językowej", najprostsza informacja, jaką można uzyskać.

Wartości wcześniej opisanych typów mogą być:

  • zerowej: wartość null.
  • Niezdefiniowane: Wartość undefined.
  • Numer: Wszystkie numery, takie jak 0, 3.1416, 1000, itp .. Również NaN i Infinity.
  • Boolean: Wartości true i false.
  • Ciąg: każdy ciąg znaków, taki jak "cat" i "bar".
+0

Zgadzam się z tobą z "string" i nową różnicą String(), przyznaję, że tego nie wiedziałem. Ale nie zgadzam się z częścią danych i obiektów.Może łańcuchy, wartości logiczne i liczby nie są obiektami, ale są reprezentowane jako obiekty w JS i jeśli robisz coś takiego jak instancja String, wynik jest prawdziwy. – mck89

+0

@ mck89, Miałem na myśli to, że prymitywna wartość jest najprostszym fragmentem danych, jaki możesz mieć, tak, możesz "traktować je jako obiekty" (np. Dostęp do odziedziczonych właściwości, '" foo ".chatAt' lub' 5 .. toFixed'), ale nadal są to tylko wartości, a nie obiekty. Informacje o 'String instanceof Object' są oczywiste, ponieważ' String' to * obiekt Function *, który dziedziczy po 'Function.prototype', który dziedziczy po' Object.prototype', dlatego 'String instanceof Function' daje także' true ' '. – CMS

3

Ciągi są obiektami w JavaScript. Nie ma prawdziwego typu danych o nazwie string, jak w PHP, C lub innych językach.

String.prototype to konstrukcja umożliwiająca dodanie funkcjonalności do wszystkich obiektów typu String. Jeśli chcesz, aby wszyscy Struny do zaoferowania na przykład funkcję konwersji wykonać następujące czynności:

String.prototype.convert = function() { 
    // Put your code in here 
} 

// Set up y new String 
var example = "cat"; 

// Now you can call your function 
example.convert(); 
+1

To nie w porządku, JavaScript ma typ String, '" cat "' to [** prymitywna wartość **] (http://bclary.com/2004/11/07/#a-4.3. 2). JavaScript może mieć również * obiekty typu String *, ale pojęcie jest inne, są po prostu zawijanymi prymitywami, np. 'alert (typof" foo "); // "string" ',' alert (typeof Object ("cat")) // "object" '. Sprawdź [moja odpowiedź] (http://stackoverflow.com/questions/4142230/prototypes-in-javascript/4142624#4142624). – CMS