Вопрос: Как расширить объект «на месте», не создавая новую ссылку на объект.
Краткое содержание: JQuery extension делает то, что говорит на банке.
Но если использовать версию jquery.extend, которая возвращает новый объект, то новый объект, ну, в общем, новый объект. Все хорошо, но если я делаю расширение в функции, в которую я передаю ссылку на объект, который будет расширен, исходный объект остается неизменным. Хорошая ловушка ждет неосторожных (меня). Вы знаете, что объекты передаются по ссылке - верно?
Пример кода: скажем, у меня есть объект
myObject = {
fontFamily : 'Tahoma',
fontSize: '12',
color : '000000'
}
и параметры по умолчанию
myDefaults = {
fontFamily : 'Tahoma',
fontSize: '15',
color : 'FF0000',
weight : 'bold',
decoration : 'underline'
}
И мой ожидаемый результат:
myObject = {
fontFamily : 'Tahoma',
fontSize: '12',
color : '000000',
weight : 'bold',
decoration : 'underline'
}
Так вот код:
var myObject = {
fontFamily : 'Tahoma',
fontSize: '12',
color : '000000'
}
$('#myObjectIn').html(JSON.stringify(myObject));
extenderoony(myObject);
$('#myObjectOut').html(JSON.stringify(myObject));
function extenderoony(obj){
var myDefaults = {
fontFamily : 'Tahoma',
fontSize: '15',
color : 'FF0000',
weight : 'bold',
decoration : 'underline'
}
obj = $.extend({}, obj, myDefaults); // << Changes the object reference of obj to a new object leaving the original object passed in as the parameter unchanged.
$('#obj').html(JSON.stringify(obj));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div >Before the extend func</div>
<div id='myObjectIn'></div>
<hr>
<div >Inside the extend func</div>
<div id='obj'></div>
<hr>
<div >After the extend func</div>
<div id='myObjectOut'></div>
Мой ответ кажется хакерским - я опубликую его ниже.