Мой объект, ограниченный требованием, видоизменяется извне, но я его клонирую - PullRequest
0 голосов
/ 24 октября 2018

У меня есть файл javascript (назовем его newconfig.js), который включает модуль (типа Object) с помощью действия require () в файле config.js:

Рассмотрим core.js длябыть:

module.exports = {
    configuration: {
        showLanguageSelector: false
    },
    tableStructure: {
        columns: [
        {
            tooltip: 'Indicates if this load has alerts or notes',
            name: 'Alerts <em>& Notes</em>'
        },
        {
            tooltip: 'Trailer number and trailer type',
            name: 'Trailer <em>Type</em>'
        },
        {
            tooltip: 'Door number',
            name: 'Door'
        },
        {
            tooltip: 'Trailer opened date/time',
            name: 'Open<span>ed</span>'
        },
        {
            tooltip: 'Trailer closed date/time',
            name: 'Closed'
        }
        ]
     }     
 };

Мой файл newconfig.js содержит:

const core = require('./core/config');

Затем я клонирую экземпляр ядра в моем файле:

let config = Object.assign({}, core);

Затем я изменяюмой локальный объект

config.Configuration = {
    showLanguageSelector: true
};

config.tableStructure.columns = [
    {
        tooltip: 'Indicates if this load has alerts or notes',
        name: 'Alerts <em>& Notes</em>',
    }, {
        tooltip: 'Trailer number and trailer type',
        name: 'Trailer <em>Type</em>',
    }
];

, чтобы я мог экспортировать его как другую конфигурацию, расширяющую конфигурацию ядра:

module.exports = config;

Когда внешний файл пытается включить файл ./core/configлокально для использования, он имеет изменения newconfig.js

IE (mylayout.js):

const core = require('./core/config');
console.log(core);

значение ядра при выводе:

    {
Configuration: {
            showLanguageSelector: false // interesting how this wasn't mutated!!!!!
        },
        tableStructure {
columns: [
            {
                tooltip: 'Indicates if this load has alerts or notes',
                name: 'Alerts <em>& Notes</em>',
            }, {
                tooltip: 'Trailer number and trailer type',
                name: 'Trailer <em>Type</em>',
            }
        ]
      }
}

Где я ошибаюсь, из-за чего моя исходная конфигурация ядра видоизменяется, если я клонирую объект в новый объект перед его изменением и экспортирую этот новый объект?

, требующий моего newconfig.js в другом jsФайл возвращает желаемое поведение:

{
    Configuration: {
            showLanguageSelector: true
    },  
    tableStructure {
       columns: [
            {
                tooltip: 'Indicates if this load has alerts or notes',
                name: 'Alerts <em>& Notes</em>',
            }, {
                tooltip: 'Trailer number and trailer type',
                name: 'Trailer <em>Type</em>',
            }
        ]
      }
}

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вместо глубокого клонирования всего исходного объекта вы можете просто клонировать части, которые необходимо изменить:

let config = Object.assign({}, core,{
  Configuration : {
    showLanguageSelector: true
  },
  tableStructure: Object.assign({},core.tableStructure,{
    columns = [
      {
          tooltip: 'Indicates if this load has alerts or notes',
          name: 'Alerts <em>& Notes</em>',
      }, {
          tooltip: 'Trailer number and trailer type',
          name: 'Trailer <em>Type</em>',
      }
    ]
  })
});
0 голосов
/ 24 октября 2018

Затем я клонирую экземпляр ядра в моем файле:

let config = Object.assign({}, core);

Это просто мелкий клон.Таким образом, свойства configuration и tableStructure в клоне все еще ссылаются на исходные свойства:

const original = {
  configuration: {
    foo: "bar"
  }
};
const clone = Object.assign({}, original);
console.log(original.configuration === clone.configuration); // true

Приведенный выше код просто создает эту структуру:

                      +−−−−−−−−−−−−−−−−−−−−−−−−+
original:Ref74132−−−−>|        (object)        |
                      +−−−−−−−−−−−−−−−−−−−−−−−−+  
                      | configuration:Ref33562 |−−+
                      +−−−−−−−−−−−−−−−−−−−−−−−−+  |
                                                  |
                                                  |  +−−−−−−−−−−−−+
                                                  +−>|  (Object)  |
                                                  |  +−−−−−−−−−−−−+
                      +−−−−−−−−−−−−−−−−−−−−−−−−+  |  | foo: "bar" |
clone:Ref85432−−−−−−−>|        (object)        |  |  +−−−−−−−−−−−−+
                      +−−−−−−−−−−−−−−−−−−−−−−−−+  |
                      | configuration:Ref33562 |−−+
                      +−−−−−−−−−−−−−−−−−−−−−−−−+

Вместо этого вам необходимо глубокий клон объект.

...