2012-05-01 10 views
6

Sto leggendo l'ultimo ECMA-262 di riferimento, edizione 5.1 giugno 2011.Un costruttore è sempre un oggetto funzione?

Nella sezione 8.6.2 tabella 9 che abbiamo nei confronti della [[Costruire]] proprietà interna:

Crea un oggetto . Invocato tramite il nuovo operatore. Gli argomenti per SpecOp sono gli argomenti passati al nuovo operatore . Gli oggetti che implementano questo metodo interno sono chiamati costruttori.

Lo standard non dice che un costruttore deve essere un oggetto funzione. Quindi possiamo avere un oggetto costruttore che non è un oggetto funzione?

Link to the standard as requested

+0

Puoi collegarti al documento spec? Non credo che molte persone saranno in grado di rispondere senza un contesto più completo per la citazione che hai fornito. (Interessante domanda, però!) – apsillers

+2

Potresti essere interessato al [Annotated ES5] (http://es5.github.com/) che è una conversione HTML del PDF degli standard 5.1 ECMA-262. Ha ancore di sezione come quella per [Sezione 8.6.2] (http://es5.github.com/#x8.6.2). –

+0

se ricordo bene, Crockford ha detto che in generale, l'uso di un costruttore non è un buon modello in JS – thepoosh

risposta

3

Mentre il termine "Costruttore" è definito (come @RobG pointed out), non c'è nulla che impedisca a un oggetto non "Costruttore" di avere un metodo [[Construct]].

Questo è un po 'di confusione. Significa che puoi utilizzare l'operatore new su un oggetto che non è un Function (quindi non un "costruttore" come da 4.3.4 ), ma in realtà fornisce un metodo [[Construct]].

Si noti che nessuno degli oggetti standard si qualifica per questo, ma lo è host objects. Un plugin per il browser come Java può esporre un oggetto in questo modo:

new java.lang.String(); // it works, so java.lang.String has a [[Construct]] method 
java.lang.String instanceof Function // false 
Object.prototype.toString.call(java.lang.String).indexOf('Function') // -1 

Nota che typeof java.lang.String rendimenti "function" anche se java.lang.String non è una funzione. Questo è corretto in base al 11.4.3 (si tratta di un oggetto host con un metodo [[Call]])

+0

Quindi ti perderai nella semantica di "che cos'è una funzione?". La specifica copre solo oggetti nativi (inclusi i built-in) e consente esplicitamente agli oggetti host di fare ciò che vogliono. Ha senso che i creatori di oggetti host seguano l'ECMA-262, ma ci sono molti casi in cui non hanno, bello vedere un esempio che non è IE. :-) – RobG

+0

@RobG Non sei sicuro di cosa stai cercando di dire qui. [8.6.2] (http://es5.github.com/#x8.6.2) copre gli oggetti host in una certa misura. Inoltre, il termine "funzione" è definito in [4.3.24] (http://es5.github.com/#x4.3.24) – user123444555621

+0

@RobG Penso che il problema sia che la specifica non è totalmente coerente. – Roland

4

La risposta è estremamente semplice. ES5 § 4.3.4 dice:

Constructor Function object that creates and initialises objects.

Quindi il gioco è fatto, per definizione, solo una funzione può essere un costruttore. Tuttavia, è probabile che esistano oggetti host che si comportano come costruttori che non hanno nessuno degli altri attributi degli oggetti Function nativi (ad esempio l'oggetto XMLHttpRequest originale in IE implementato in ActiveX).

+0

Sto accettando questo come risposta. IMHO le specifiche non sono del tutto chiare in quanto sembra che un oggetto che non è una funzione possa ancora avere una proprietà interna [[Costruisci]], almeno la tabella 9 a cui si fa riferimento nella domanda non lo proibisce esplicitamente. Se qualcuno sa chi è l'autore delle specifiche, vorrei scrivergli una mail e chiedere chiarimenti. – Roland

0

Per aggiungere alla Pumbaa80 di answer (questo sarebbe troppo lungo per un commento).

La confusione aumenta per 13.2.2 secondo cui quandoconstruct viene eseguita una funzione di suo funzionamento call deve essere eseguita (ma non dice ciò che deve essere fatto quando il construct di un oggetto che non sia una funzione è eseguita). Ora, gli oggetti che implementano call sono richiamabili , funzione oggetti in base a 9.11.

Anche in base a 4.2 "una funzione è un oggetto richiamabile". Ma ovviamente questo non implica che ogni oggetto callable sia una funzione.

Quindi se ho capito bene gli oggetti non Function possono avere un metodo Construct e anche un metodo Call. java.lang.String sarebbe uno di questi esempi.

Problemi correlati