In che modo quasi tutto in Javascript è un object?

Ho letto molto in molte introduzioni di JavaScript. Semplicemente non lo capisco. Penso sempre agli oggetti come a qualcosa con metodi e proprietà. Matrici che capisco, dato che ha una coppia di valori chiave. Che ne dici di “stringhe” o “numeri” o “funzioni”? Queste cose sopra elencate sembrano essere funzioni simili a me. Questo significa che inserisci qualcosa, ottieni qualcosa. Non hai davvero le proprietà di accesso o altro. Non c’è nessuna notazione punto usata negli array o questa lista di “oggetti”.

Qualcuno codifica alcuni esempi di ognuno di questi con notazioni puntate a cui si accede ai suoi metodi e proprietà? Sospetto che la definizione di object sia probabilmente limitata dal momento in cui ho iniziato a conoscere JavaScript …

Esatto, in javascript, quasi tutto è un object. Ma questi oggetti sono leggermente diversi da ciò che vediamo in Java, C ++ o altri linguaggi convenzionali. Un object in JS è semplicemente una hashmap con coppie chiave-valore. Una chiave è sempre una stringa e un valore può essere qualsiasi cosa che includa stringhe, numeri interi, booleani, funzioni, altri oggetti ecc. Così posso creare un nuovo object come questo:

var obj = {}; // this is not the only way to create an object in JS 

e aggiungere nuove coppie chiave-valore in esso:

 obj['message'] = 'Hello'; // you can always attach new properties to an object externally 

o

 obj.message = 'Hello'; 

Allo stesso modo, se voglio aggiungere una nuova funzione a questo object:

 obj['showMessage'] = function(){ alert(this['message']); } 

o

 obj.showMessage = function() { alert(this.message); } 

Ora, ogni volta che chiamo questa funzione, mostrerà un pop-up con messaggio:

 obj.showMessage(); 

Le matrici sono semplicemente quegli oggetti che sono in grado di contenere liste di valori:

 var arr = [32, 33, 34, 35]; // one way of creating arrays in JS 

Sebbene sia sempre ansible utilizzare qualsiasi object per memorizzare valori, ma gli array consentono di memorizzarli senza associare una chiave a ciascuno di essi. Quindi puoi accedere a un object usando il suo indice:

 alert(arr[1]); // this would show 33 

Un object array, proprio come qualsiasi altro object in JS, ha le sue proprietà, come ad esempio:

 alert(arr.length); // this would show 4 

Per i dettagli approfonditi, consiglio vivamente le tecniche Pro Javascript di John Resig.

No, non tutto è un object in JavaScript. Molte cose con cui si interagisce regolarmente (stringhe, numeri, booleani) sono primitive, non oggetti. A differenza degli oggetti, i valori primitivi sono immutabili. La situazione è complicata dal fatto che queste primitive hanno wrapper di oggetti ( String , Number e Boolean ); questi oggetti hanno metodi e proprietà mentre i primitivi no, ma i primitivi sembrano avere metodi perché JavaScript crea silenziosamente un object wrapper quando il codice tenta di accedere a qualsiasi proprietà di una primitiva.

Ad esempio, considera il seguente codice:

 var s = "foo"; var sub = s.substring(1, 2); // sub is now the string "o" 

Dietro le quinte, s.substring(1, 2) si comporta come se s.substring(1, 2) i seguenti passi (approssimativi):

  1. Creare un object String wrapper da s , equivalente all’utilizzo di new String(s)
  2. Chiamare il metodo substring() con i parametri appropriati sull’object String restituito dal passaggio 1
  3. Smaltire l’object String
  4. Restituisce la stringa (primitiva) dal punto 2.

Una conseguenza di ciò è che mentre sembra che sia ansible assegnare le proprietà ai primitivi, è inutile perché non è ansible recuperarli:

 var s = "foo"; s.bar = "cheese"; alert(s.bar); // undefined 

Ciò accade perché la proprietà viene effettivamente definita su un object String che viene immediatamente scartato.

Anche i numeri e le booleane si comportano in questo modo. Le funzioni, tuttavia, sono oggetti a tutti gli effetti ed ereditano da Object (in realtà Object.prototype , ma questo è un altro argomento). Le funzioni quindi possono fare tutto ciò che gli oggetti possono, incluso avere proprietà:

 function foo() {} foo.bar = "tea"; alert(foo.bar); // tea 

La frase “In JavaScript, QUASI tutto è un object” è corretta, perché le unità di codice MAIN (oggetti, funzioni, matrici) sono oggetti JavaScript.
Il codice JavaScript utilizza 9 diverse unità più 1 (multiplo):
– 01. array
– 02. booleano
– 03. funzione
– 04. null
– 05. numero
– 06. object
– 07. regexp
– 08. stringa
– 09. indefinito
– 10. multiplo

MA Oggetti JavaScript:
– NON sono le stesse creature degli “oggetti” in altri linguaggi orientati agli oggetti.
– sono una collezione di coppie nome-valore.
– tutti hanno una funzione di creazione (il suo costruttore).
– tutti INHERIT i membri del prototipo-object del suo costruttore e questo è il suo prototipo.
– tutte le funzioni sono oggetti MA NON tutti gli oggetti sono funzioni .
– Le funzioni hanno scope, oggetti NOT (un difetto di progettazione secondo me).
– Oggetto, funzione, matrice, stringa, … con il primo CAPITALE sono le funzioni !!!
– È più importante la differenza tra oggetti e funzioni JS, rispetto alle sue comunanze.
– il nome “istanza” in JS ha un significato diverso con il nome “istanza” nella teoria della conoscenza in cui un’istanza eredita gli attributi del suo concetto generico. In JS denota solo il suo costruttore. JavaScript ha ottenuto il nome ‘instance’ da ‘class-based-inheritance’ ool (java) dove è un nome appropriato perché quegli oggetti ereditano gli attributi delle classi.
Un nome migliore per la parola chiave JS ‘instanceof’ è ‘objectof’.

Le funzioni JS SONO oggetti JS perché:
1) possono avere membri come oggetti JS:

     > function f () {}
     non definito
     > fs = "una stringa"
     "una stringa"
     > fs
     "una stringa"

2) hanno una funzione di costruzione, come tutti gli oggetti JS, la funzione Function:

     > (funzione f () {}) instanceof Function
     vero

3) come tutti gli oggetti JS, il loro prototipo-object è lo stesso con il suo prototipo di costruttore:

     > (funzione f () {}) .__ proto__ === Function.prototype
     vero
     > ({}) .__ proto__ === Object.prototype
     vero
     > (nuovo object) .__ proto__ === Object.prototype
     vero

4) Naturalmente, le funzioni JS come oggetti JS SPECIFICHE hanno e attributi extra, come tutte le funzioni nei linguaggi di programmazione, che gli oggetti JS non hanno come se fosse ansible chiamarli (eseguirli) con le informazioni di input e output.

TUTTO NON è un object, perché, ad esempio, NON possiamo aggiungere membri a una stringa letterale:

     > var s = "stringa"
     non definito
     > s.s2 = "s2string"
     "S2string"
     > s.s2
     non definito

Non tutto è un object in javaScript. JavaScript ha primitive e oggetti. Esistono sei primitivi: null, non definito, stringa, numero, booleano e simbolo. Potrebbe sembrare che tutto stia agendo come un object a causa delle proprietà e della funzione a cui è ansible accedere.per esempio-

 var stringvar="this string"; typeof stringvar; // "string" stringvar.length; //11 

da quando “stringvar” è un tipo di stringa, che è un tipo primitivo, non dovrebbe essere in grado di accedere alla lunghezza della proprietà. Può farlo a causa di qualcosa chiamato Boxing.Boxing è il processo in cui qualsiasi tipo primitivo viene convertito in un tipo di object e il contrario è chiamato Unboxing. Questi tipi di oggetti o Object wrappers sono creati con la vista che ci sono alcune operazioni comuni che potrebbero essere necessarie per eseguire i valori primitivi. Contiene metodi e proprietà utili e sono prototipo legati ai primitivi. Per quanto riguarda gli oggetti, è ansible aggiungere coppie di valori chiave a tutti gli oggetti, anche agli array.

 var arr=[1,2,3]; arr.name="my array"; arr; //[1,2,3,name:'my array'] 

questo non significa che il quarto elemento dell’array sia “name: ‘my array'”. “name” è una proprietà che può essere chiamata con notazione dot (arr.name) o notazione parentesi (arr [“nome”]) .