2015-07-29 13 views
11

Desidero scrivere una serie di articoli/esercitazioni relativi a JavaScript. Stavo cercando le specifiche ECMA quando ho scoperto il paragrafo interessante this.JavaScript ha oggetti esotici?

Come ECMA-262 (Versione 6) afferma:

4.3.7 oggetto esotici

oggetto che non ha il comportamento predefinito per uno o più dei metodi interni essenziali che devono essere supportate da tutti gli oggetti

NOTA Qualsiasi oggetto che non sia un oggetto ordinario è un oggetto esotico.

Ora sono curioso. Gli oggetti esotici si trovano nel JavaScript del browser moderno?

In tal caso: potrei darmi un esempio e dire in che misura il suo comportamento è diverso da "oggetti ordinari"?

+2

In DOM terra ospita API, il 'HTMLElement.dataset.prototype' oggetto ha getter e setter di magia, che si comportano diverso da oggetti ordinari. –

+1

[document.all] (https://html.spec.whatwg.org/multipage/obsolete.html#dom-document-all) – Knu

risposta

11

Un possibile esempio:

L'istanza oggetti creati da Array sono esotici (un termine usato dalle specifiche ECMAScript per gli oggetti che hanno caratteristiche che gli oggetti normali non hanno): Le loro tracce lunghezza di proprietà e influenze la gestione degli elementi dell'array. In generale, gli oggetti esotici possono essere creati da zero, ma non è possibile convertire un oggetto normale esistente in uno esotico.

Tratto da http://www.2ality.com/2015/02/es6-classes-final.html

C'è anche un elenco più avanti nelle specifiche tra cui Array, String, e così via.

Non sono "esotici" nel senso di misterioso e/o sexy.

+0

Cosa intendi per "caratteristiche che gli oggetti normali non hanno"? infine ci sono alcuni codici built-in (es: per le tracce di lunghezza di un array) che gli oggetti normali potrebbero avere. –

+0

@Vandaad * Potrebbe * avere, sì. Sebbene 'lunghezza' fa molto di più che tracciare la lunghezza. Ad esempio, http://stackoverflow.com/a/31550694/438992 e dalla specifica: "Un oggetto esotico è una qualsiasi forma di oggetto la cui semantica delle proprietà differisce in qualche modo dalla semantica predefinita." Penso che la gente stia leggendo troppo nella parola "esotico". –

+0

Ho appena letto su 'Funzioni associate 'https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind - Anche questi sono oggetti esotici. Per motivi di interesse, potremmo anche dire che questi oggetti sono 'Tropical' e' Temperate'? –

3

Section 9.4 dello stesso documento elenca oggetti esotici. Ad esempio un array è un tale oggetto. Tra l'altro, il metodo interno [[DefineOwnProperty]] è diverso dal metodo standard definito per gli oggetti in quanto tratta "chiavi" numeriche in modo diverso.

+2

Qual è il punto di -1 senza un commento che lo spiega? – Amit

+0

E per dare una panoramica dei tipi in quella sezione, vengono riconosciuti i seguenti tipi di oggetti esotici: funzioni associate, matrici, stringhe, argomenti, numeri interi indicizzati (apparentemente correlati ai buffer di array), spazio dei nomi dei moduli e proxy. Un riassunto più lungo è qui: https: //www.quora.it/What-are-some-examples-of-ES6-JavaScript-exotic-objects –

1

array DOM vs Array

se si prova in un browser document.getElementsByTagName('*') il risultato sembra essere un oggetto Array che contiene tutti gli elementi DOM che corrispondono alla tua ricerca. Ma su quell'array non è possibile chiamare la maggior parte delle funzionalità di array in quanto non è realmente una matrice.

ecco un esempio:

var normalArray = [{objectId: 1}, {objectId: 2}, {objectId: 3}, {objectId: 4}]; 
 
var domArray = document.getElementsByTagName('*'); 
 

 
log(normalArray.length + ' objects in normalArray'); 
 
log(domArray.length + ' objects in domArray'); 
 
printArray(normalArray); 
 
printArray(domArray); 
 

 
function printArray(array){ 
 
    // lets try with array 
 
    try{ 
 
    log('printing normalArray'); 
 
    array.forEach(function(data, index){ 
 
     log('Iteration on ' + index + ' ok', 'success'); 
 
    }); 
 
    }catch(e){ 
 
    log('failed because of ' + e, 'error'); 
 
    } 
 
} 
 

 
function log(msg, className){ 
 
    var logEl = document.createElement('pre'); 
 
    logEl.innerText = msg; 
 
    logEl.className = className || ''; 
 
    document.getElementById('logs').appendChild(logEl); 
 
}
pre{ 
 
    background: #eee; 
 
    padding: 3px; 
 
    margin: 1px; 
 
    border-radius: 3px; 
 
} 
 

 
pre.error{ 
 
    background: #fdd; 
 
} 
 

 
pre.success{ 
 
    background: #dfd; 
 
}
<!DOCTYPE html> 
 
<html> 
 
\t <head> 
 
\t \t <meta charset="utf-8"> 
 
\t \t <title>some test</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <h1>title</h1> 
 
\t \t <p> 
 
\t \t \t Some texts with some <a href="#">links</a> 
 
\t \t </p> 
 
     
 
     <div id="logs"></div> 
 
\t </body> 
 
</html>

+0

Qual è il punto in questo frammento? Stai cercando di dire che 'domArray' è esotico perché non ha una funzione' forEach' definita? (Suggerimento: non è un "requisito" per oggetti ordinari) – Amit

+2

'getElementsByTagName' e metodi simili restituiscono un' NodeList', non una matrice. – Lesleh

+0

Ho frainteso quella definizione immagino, possiamo definire "metodi interni essenziali", quindi, vorrei saperlo anche io. – zeachco

Problemi correlati