ES5 ha aggiunto uno number di methods a Object
, che sembrano rompere la coerenza semantica di JavaScript.Perché i metodi oggetto ES5 non sono stati aggiunti a Object.prototype?
Ad esempio, prima di questa estensione, l'API JavaScript girava sempre attorno all'operando su l'oggetto stesso;
var arrayLength = [].length;
var firstPosInString = "foo".indexOf("o");
... dove sono come i nuovi metodi Oggetto;
var obj = { };
Object.defineProperty(obj, {
value: 'a',
writable: false
});
... quando il seguente sarebbe stato molto più conformativa:
var obj = { };
obj.defineProperty({
value: 'a',
writable: false
});
Qualcuno può raffreddare la mia curiosità sul motivo per cui questo è? C'è qualche frammento di codice che potrebbe rompersi? Ci sono discussioni pubbliche fatte dal comitato di normazione sul motivo per cui hanno scelto questo approccio?
Interessante ... sai come è stato allineato con' Object.create'? Crockford lo propose come "Object.create" dopo che erano state prese queste decisioni, o prima? –
Buona domanda. Non ne ho idea :) Penso che Crockford abbia ribattezzato il suo 'Object.beget' in' Object.create' all'incirca nello stesso momento in cui sono state discusse queste API. FWIW, il documento dice: _ 'Nota che Object.create senza il suo secondo argomento opzionale è essenzialmente la stessa operazione della funzione di beget che è stata ampiamente promossa. Noi (forse non sorprendentemente) siamo d'accordo con l'utilità di questa funzione ma sentiamo che la parola "generare" è probabilmente confusa con molti non di madrelingua inglese. " – kangax
Crockford fu direttamente coinvolto nel progetto ES5 e originariamente propose di" generare ". "creare" è emerso come il nome preferito durante le successive discussioni sul design. Ha ribattezzato "beget" nel suo libro per riflettere la decisione di progettazione ES. –