2015-03-12 23 views
12

Mentre passa attraverso la lista dei metodi di underscorejs s', non ho potuto fare a meno di notare un metodo che non mi ricordo di essere lì davanti: extendOwnunderscorejs: qual è la differenza tra extendOwn vs extend?

Il documentation for this method dice il seguente:

extendOwn _.extendOwn (destinazione, * fonti) Alias ​​: assegnare

Come estendere, ma solo copie proprie proprietà oltre all'oggetto di destinazione.

Capisco come .extend() viene utilizzato e cosa fa ... ma per la vita di me non riesco a capire come si differenzia da .extendOwn().

Ho provato a utilizzare .extend() e quindi a .extendOwn() per estendere alcuni oggetti solo per vedere se forse c'era qualcosa di ovvio che sarebbe successo - ma sembra che entrambi producano lo stesso risultato.

var a = { 
    foo: false 
}; 

var b = { 
    bar: true 
}; 

// This will produce { foo: false, bar: true }; ..just like _.extend() would =\ 
_.extendOwn(a, b); 

Qualsiasi comprensione di questo mistero sarebbe molto apprezzata!

+0

non ho - che è una buona idea anche se grazie –

+0

eh, così ho appena letto la fonte. La cosa divertente è che si riduce a usare _.keys vs _.allKeys - che a sua volta è diverso si usa nativeKeys e il seguente: for (var key in obj) if (_.has (obj, key)) keys. push (chiave); dove l'altro no. non so - sembra ancora un po 'un mistero per me perché extendOwn è addirittura necessario. –

risposta

8

Quindi per chiunque chiedendo, un buon posto per trovare la risposta è qui: https://github.com/jashkenas/underscore/search?q=extendOwn&type=Issues&utf8=%E2%9C%93

Aggiornamento

Per chiunque sia interessato, la risposta è che extendOwn è sinonimo di Object.assign con l'attuazione di essere una minuscola un po 'diverso Underscorejs sta semplicemente aggiungendo un'alternativa ad esso. Invece di ignorare assign con una nuova implementazione in Underscorejs e chiamandolo _.assign, lo chiamano _.extendOwn (con _.extendOwn).

Il motivo di questa convenzione di denominazione è comprensibile, ma imho un po 'di confusione. Vedete, Object.assign è il nome ufficiale di ES6 per il metodo/logica che conosciamo come "estendere" (come viene chiamato da strumenti come jQuery e Underscore).

The decision by the Underscore team era che hanno deciso di chiamare il metodo principale/genitore extendOwn per aderire ai propri standard interni. Denominare il metodo principale _.assign sarebbe (per il team di Underscore) contro intuitivo quanto a loro, confonde ciò che fa "estendere". Chiamandolo extendOwn, si dice che questo metodo faccia la stessa cosa di "estendere", ma si basa sull'implementazione di ES6 di questa funzionalità nota come "assegna".

In sostanza, quello che avevano qui era un paradosso e avevano bisogno di prendere una decisione. O si attengono alla convenzione che conosciamo come "estendere" o che consentono "assegna" - che sarebbe solo in conflitto con quel nome originale (che potrebbe anche iniziare a indurre le persone a mettere in discussione il motivo per cui chiamerebbero ancora l'altro metodo "estendere" piuttosto che assignSomethinghere invece).

Breve storia - extendOwn è la versione di Underscore di ES23 Object.assign.L'hanno appena chiamato con il nome extendOwn per mantenerlo allineato e con la stessa convenzione di denominazione, che si chiama extend.

+4

Direi che ['hasOwnProperty' su MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) potrebbe fare una buona lettura proprio adesso. –

+1

oh mio dio - questo aiuta davvero! grazie mu !! –

+0

La chiamata '_.has' all'interno del ciclo' in' che hai citato nel tuo commento è probabilmente solo un alias per 'obj.hasOwnProperty (key)'. La proprietà 'extendOwn' non solleva il prototipo ma' estendi' fa; non ci sarà alcuna differenza se stai usando solo oggetti semplici (ad esempio 'o = {...}'). –

6

"Proprietà proprie" è un termine tecnico in JS. Le proprietà di un oggetto sono quelle che non ha ereditato.

Ecco un breve frammento che espone il diverso comportamento di extend e extendOwn:

// lines have length 
line = { length: 4 } 

// planes have width and inherit length 
plane = Object.create(line) 
plane.width = 5 
plane.length // 4 

// making a cube object, using extend 
cube = _.extend({ height: 6 }, plane) 
cube.length // 4 

// making a cube object, using extendOwn 
notACube = _.extendOwn({ height: 6 }, plane) 
notACube.length // undefined 

Come si può vedere, extendOwn proprietà solo copiate che sono stati definiti direttamente sulla sorgente, mentre extend anche copiato quelli definiti insieme la sua catena prototipo. Da notare anche la simmetria con _.has:

_.has(plane, 'width') // true 
_.has(plane, 'length') // false 
+0

Questa risposta è utile. La documentazione di Underscore è davvero schifosa a spiegare questo. – luxon