2015-07-29 9 views
11

Ich möchte eine Reihe von JavaScript verwandten Artikeln/Tutorials schreiben. Ich habe die ECMA-Spezifikation nachgeschlagen, als ich den interessanten Absatz this entdeckte.Hat JavaScript exotische Objekte?

als ECMA-262 (Version 6) heißt es:

4.3.7 exotische Objekt

Objekt, das nicht das Standardverhalten für eine oder mehrere der wesentlichen internen Methoden hat, die unterstützt werden müssen nach allen Objekten

HINWEIS Jedes Objekt, das kein gewöhnliches Objekt ist, ist ein exotisches Objekt.

Jetzt bin ich neugierig. Sind solche exotischen Objekte im JavaScript des modernen Browsers zu finden?

Wenn ja: Könnte man mir ein Beispiel geben und sagen, inwieweit sich sein Verhalten von "gewöhnlichen Objekten" unterscheidet?

+2

In DOM API Host-Land, das 'HTMLElement.dataset.prototype' Objekt Magie Getter und Setter, die als gewöhnliche Objekte verhalten sich anders hat. –

+1

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

Antwort

11

Ein mögliches Beispiel:

Die Instanz von Array sind exotische erstellte Objekte (ein Begriff von der ECMAScript-Spezifikation für Objekte verwendet, die Funktionen, die normalen Objekte nicht haben): Die Eigenschaft Länge Spuren und Einflüsse die Verwaltung von Array-Elementen. Im Allgemeinen können exotische Objekte von Grund auf neu erstellt werden, aber Sie können ein vorhandenes normales Objekt nicht in ein exotisches Objekt umwandeln.

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

gibt es auch eine Liste später in der Spezifikation einschließlich Array, String, und so weiter.

Sie sind nicht "exotisch" im Sinne von mysteriös und/oder sexy.

+0

Was meinen Sie mit "Features, die normale Objekte nicht haben"? Schließlich gibt es einige eingebaute Codes (zB für Längenspuren eines Arrays), die normale Objekte haben könnten. –

+0

@Vandaad * Kann * haben, ja. Obwohl "length" mehr als nur die Länge verfolgt. Z. B. http://stackoverflow.com/a/31550694/438992 und aus der Spezifikation: "Ein exotisches Objekt ist irgendeine Form von Objekt, dessen Eigenschaftssemantik in irgendeiner Weise von der Standard-Semantik abweicht." Ich denke, die Leute lesen zu viel in das Wort "exotisch". –

+0

Ich habe gerade über 'Bound Functions' gelesen https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind - Dies sind exotische Objekte auch. Interessanterweise könnten wir auch sagen, dass diese Objekte "Tropical" und "Temperate" sind? –

3

Section 9.4 desselben Dokuments listet exotische Objekte auf. Ein Array ist beispielsweise ein solches Objekt. Unter anderem unterscheidet sich die interne Methode [[DefineOwnProperty]] von der für Objekte definierten Standardmethode dadurch, dass numerische Schlüssel unterschiedlich behandelt werden.

+2

Was ist der Punkt von -1 ohne einen Kommentar, der es erklärt? – Amit

+0

Um einen Überblick über die Typen in diesem Abschnitt zu geben, werden die folgenden exotischen Objekttypen erkannt: gebundene Funktionen, Arrays, Zeichenfolgen, Argumente, Ganzzahl indiziert (scheinbar mit Array-Puffern verwandt), Modul-Namespace und Proxy. Eine längere Zusammenfassung ist hier: https: //www.quora.com/Was-sind-einige-Beispiele-von-ES6-JavaScript-exotic-objects –

1

DOM-Arrays vs Array

wenn Sie versuchen, in einem Browser document.getElementsByTagName('*') das Ergebnis ein Array-Objekt zu sein, sieht alle DOM-Elemente enthält, die Ihre Suche entsprechen. Aber auf diesem Array können Sie nicht die meisten Array-Funktionen aufrufen, da es sich nicht wirklich um ein Array handelt.

hier ist ein Beispiel:

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

Was ist der Sinn dieses Snippets? Willst du sagen, dass 'domArray' exotisch ist, weil es keine 'forEach'-Funktion definiert hat? (Hinweis: das ist keine "Voraussetzung" für gewöhnliche Objekte) – Amit

+2

'getElementsByTagName' und ähnliche Methoden geben eine' NodeList' zurück, kein Array. – Lesleh

+0

Ich habe diese Definition falsch verstanden, können wir 'essentielle interne Methoden' definieren, dann würde ich es auch gerne wissen. – zeachco