2010-04-29 15 views
8

Per quanto ho capito, ogni stringa è un oggetto in Javascript. Eppure, "non funziona", come mi aspetto che sia:Valore di proprietà di un oggetto String in JavaScript

var a="abc"; //here we get a new string object 
a.b = 123; //I seem to declare a property "b" of that object 
alert(a.b); //alerts "undefined" 

Tuttavia, se provo a definire una stringa nel "modo sbagliato", tutto funziona come previsto

var a=new String("abc"); // 
a.b = 123; 
alert(a.b); //alerts "123" 

Perché è così?

risposta

8

Potreste essere interessati a verificare la prima parte di questo articolo:

Citando:

Ci sono due diversi tipi di stringhe e si comportano abbastanza in modo diverso. Un valore letterale viene creato solo utilizzando le virgolette attorno alla stringa. Un oggetto viene creato mediante l'uso implicito della nuova parola chiave. Se assegni una stringa a una variabile usando la parola chiave String, senza la nuova parola chiave il contenuto della parentesi verrà eseguito come stringa letterale.

Un letterale stringa ha accesso a tutti gli oggetti e metodi di una stringa poiché javascript eseguirà temporaneamente una stringa letterale come oggetto stringa per eseguire il metodo desiderato.

Dove i due differiscono è il loro trattamento di nuove proprietà e metodi. Come tutti gli oggetti Javascript, puoi assegnare proprietà e metodi a qualsiasi oggetto String.

Non è possibile aggiungere proprietà o metodi a un valore letterale stringa. Sono ignorati dall'interprete.

Il motivo per cui non è possibile aggiungere proprietà o metodi a una stringa letterale è che quando si tenta di accedere a una proprietà o un metodo letterale, l'interprete Javascript copia temporaneamente il valore della stringa in un nuovo oggetto e quindi utilizza tale oggetto proprietà o metodi. Ciò significa che un letterale String può solo accedere a proprietà o metodi predefiniti di una stringa e quelli che sono stati aggiunti come prototipi.

+0

Capito, grazie - "La ragione per cui non è possibile aggiungere proprietà o metodi a una stringa letterale è che quando si tenta di accedere alla proprietà o il metodo, l'interprete JavaScript temporaneamente copia il valore della stringa in un letterale un nuovo oggetto e quindi utilizzare le proprietà oi metodi dell'oggetto. " ;-) – naivists

4

Ciò avviene perché l'property accessors, (. e []) convertire il valore ToObject.

qualcosa di equivalente a questo succede dietro le quinte:

var a="abc"; 
new Object(a).b = 123; 
alert(a.b); // undefined 

Fondamentalmente un oggetto viene creato al volo, per la funzione di accesso di proprietà, vedere la Fase 5:

La produzione MemberExpression: MemberExpression [ Expression ] (o MemberExpression . Identifier) è valutata come segue:

  1. Valutare MemberExpression.

  2. Chiama GetValue(Result(1)).

  3. Valuta espressione.

  4. Chiama GetValue(Result(3)).

  5. Chiama ToObject(Result(2)).

  6. Chiama ToString(Result(4)).

  7. Restituisce un valore di tipo Riferimento il cui oggetto di base è Result (5) e il cui nome di proprietà è Result(6).

Problemi correlati