2015-07-29 10 views
11

Chcę napisać serię artykułów/samouczków związanych z JavaScript. Sprawdzałem specyfikację ECMA, gdy odkryłem interesujący akapit this.Czy JavaScript ma egzotyczne obiekty?

Jak ECMA-262 (wersja 6) stwierdza:

4.3.7 egzotyczny obiekt

obiekt, który nie ma domyślnego zachowania dla jednego lub więcej z podstawowych metod wewnętrznych, które muszą być obsługiwane przez wszystkie obiekty

UWAGA Każdy obiekt, który nie jest zwykłym obiektem, jest obiektem egzotycznym.

Teraz jestem ciekawy. Czy takie egzotyczne obiekty można znaleźć we współczesnej przeglądarce JavaScript?

Jeśli tak, to czy można podać przykład i stwierdzić, jak daleko jego zachowanie różni się od "zwykłych obiektów"?

+2

w Domu gospodarza API ziemi, 'HTMLElement.dataset.prototype' obiekt posiada magiczne pobierające i ustawiające, które zachowują się inaczej niż zwykłych przedmiotów. –

+1

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

Odpowiedz

11

możliwy przykład:

Instancja przedmiotów wytworzonych tablicy egzotyczne (termin używany w niniejszym opisie ECMAScript przedmiotów, które mają cechy, które zwykłe obiekty nie mają) ich długości torów własności i wpływów zarządzanie elementami tablicy. Ogólnie rzecz biorąc, obiekty egzotyczne można tworzyć od zera, ale nie można przekształcić istniejącego normalnego obiektu w obiekt normalny.

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

Jest też lista później w tym spec Array, String, i tak dalej.

Nie są "egzotyczne" w sensie tajemniczym i/lub seksownym.

+0

co masz na myśli przez "funkcje, których normalne obiekty nie mają"? w końcu istnieją wbudowane kody (np. dla ścieżek długości tablicy), które mogą mieć zwykłe obiekty. –

+0

@Vandaad * Mógł * mieć, tak. Chociaż "długość" ma więcej niż tylko śledzenie długości. Np. Http://stackoverflow.com/a/31550694/438992 oraz ze specyfikacji: "Obiektem egzotycznym jest jakakolwiek forma obiektu, którego semantyka właściwości różni się w jakikolwiek sposób od domyślnej semantyki." Myślę, że ludzie zbyt dużo czytają w słowie "egzotyczny". –

+0

Właśnie czytałem o 'Bound Functions' https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind - To też jest obiekt egzotyczny. W interesie, czy moglibyśmy powiedzieć, że te obiekty to 'Tropical' i' Temperate'? –

3

Section 9.4 tego samego dokumentu zawiera listę egzotycznych obiektów. Na przykład tablica jest takim obiektem. Między innymi jest to metoda wewnętrzna różni się od standardowej metody zdefiniowanej dla obiektów, ponieważ inaczej traktuje numeryczne "klucze".

+2

Jaki jest punkt -1 bez komentarza wyjaśniającego to? – Amit

+0

Aby wyświetlić przegląd typów w tej sekcji, rozpoznawane są następujące egzotyczne typy obiektów: powiązane funkcje, tablice, łańcuchy, argumenty, indeksowane liczby całkowite (najwyraźniej związane z buforami tablicowymi), przestrzeń nazw modułów i proxy. Dłuższe podsumowanie znajduje się tutaj: https: //www.quora.com/Jakie są przykłady-ES6-JavaScript-egzotycznych obiektów –

1

DOM tablice vs Array

jeśli spróbujesz w przeglądarce document.getElementsByTagName('*') wynik wygląda być przedmiotem tablicę zawierającą wszystkie elementy DOM pasujących do zapytania. Ale w tym Array nie można wywoływać większości funkcji Array, ponieważ nie jest to tak naprawdę Array.

o to przykład:

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

Jaki jest sens tego fragmentu? Czy próbujesz powiedzieć, że 'domArray' jest egzotyczny, ponieważ nie ma zdefiniowanej funkcji' forEach'? (Podpowiedź: to nie jest "wymaganie" w przypadku zwykłych obiektów). – Amit

+2

'getElementsByTagName' i podobne metody zwracają' NodeList', a nie Array. – Lesleh

+0

Myślę, że źle rozumiem tę definicję, czy możemy zdefiniować "podstawowe metody wewnętrzne", tak też chciałbym wiedzieć. – zeachco

Powiązane problemy