Mam dość ciągłego pisania kodu w ten sposób:
function shallowExtend(obj1,obj2){
var key;
for ( key in obj2 ) {
if ( obj2.hasOwnProperty(key) === false ) continue;
obj1[key] = obj2[key]
}
}
Lub jeśli nie chcę sam pisać kodu, zaimplementuj bibliotekę, która już to robi. Z pewnością ES6 + przybywa na ratunek, a to zapewni nam coś w rodzajuObject.prototype.extend(obj2...)
lubObject.extend(obj1,obj2...)
Czy więc ES6 + zapewnia taką funkcjonalność? Jeśli jeszcze go tam nie ma, to czy jest planowana taka funkcjonalność? Jeśli nie zaplanowano, dlaczego nie?
javascript
ecmascript-6
balupton
źródło
źródło
[[Prototype]]
sieci? Robisz „głębokie” czy „płytkie” kopie? A co z właściwościami, których nie można wyliczyć i nie można zapisać? Myślę, że wolałbym mieć małą funkcję biblioteczną, która robi to, czego potrzebuję, a w większości przypadków i tak można jej uniknąć.Odpowiedzi:
Będziesz mógł wykonać płytkie scalanie / rozszerzanie / przypisywanie w ES6 za pomocą Object. assign:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/ assign
Składnia:
gdzie ... źródła reprezentują obiekty źródłowe.
Przykład:
źródło
let merged = Object.assign({}, source1, source2);
Object.assign
: zobacz moją odpowiedź tutajJSON.parse(JSON.stringify(src))
Możesz użyć do tego składni rozszerzania obiektów :
W przypadku tablic operator rozprzestrzeniania był już częścią ES6 (ES2015), ale dla obiektów został dodany do specyfikacji języka w ES9 (ES2018). Jego propozycja została domyślnie włączona w narzędziach takich jak Babel dużo wcześniej.
źródło
const ob1 = {foo: 123}; const ob2 = {bar: 234}; const merged = {...ob1, ...ob2}; console.log(merged)
Wyjście:{ foo: 123, bar: 234 }
Wiem, że to trochę stary problem, ale najłatwiejsze rozwiązanie w ES2015 / ES6 jest w rzeczywistości dość proste, używając Object. assign (),
Miejmy nadzieję, że to pomoże, ale to również robi głębokie scalanie:
Przykładowe użycie:
źródło
Object.mixin
Obecnie omawiamy dodanie elementu , aby zadbać o zachowanie, o które prosisz. https://mail.mozilla.org/pipermail/es-discuss/2012-December/027037.htmlChociaż nie ma go jeszcze w wersji roboczej ES6, wydaje się, że jest dla niego duże poparcie, więc myślę, że wkrótce pojawi się w wersjach roboczych.
źródło
.mixin
został usunięty przez TC39.ES6
ES7 lub Babel
źródło
Może
Object.defineProperties
metoda ES5 zadziała?na przykład
Dokumentacja MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties
źródło
defineProperties
definiuje własne właściwości. Nie nadpisuje właściwości w[[prototype]]
łańcuchu, zacienia je.Object.getOwnPropertyDescriptor
również użyć do ustawienia właściwości, gdy jest to wartość złożona, lub skopiujesz przez odniesienie.