Ошибка объект не поддерживает свойство или метод assign

Настроил webpack + babel следующим образом

webpack.config.js

...
  module: {
    rules: [
      {
        test: /.(js|jsx)$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      },
...

.babelrc

{
  "plugins": ["lodash", "transform-object-rest-spread"],
  "presets": [
    ["env", {
      "targets": [
        "> 4%",
        "ie 11",
        "safari 8"
      ]
    }],
    "react",
    "react-optimize"
  ],
  "env": {
    "test": {
      "presets": ["es2015", "react"]
    }
  }
}

Запускаю в chrom все ок, в IE 11 выдает ошибку

Объект не поддерживает свойство или метод «assign»

@John Doe

I figured out from your comment that you want to implement this in node/react stack. This is very different from original question and you should have asked your own ;)
Anyways, Heres what you need to do…

You can use [es6-object-assign][1]. It is an ES6 Object.assign() «polyfill».

First, in package.json in your root folder, add es6-object-assign as a dependency:

"dependencies": {
    "es6-object-assign": "^1.0.2",
    "react": "^0.12.0",
    ...
  },

Then if you want to use it in node environment use:

require('es6-object-assign').polyfill();

If you are having the issue on front (browser) end…
Add it in your index.html file…

<script src="location_of_node_modules/es6-object-assign/dist/object-assign.min.js"></script>
<script>
  window.ObjectAssign.polyfill();
</script>

location_of_node_modules depends on boilerplate you use, mostly just node_modules, but sometimes when index.html is in a subdirectory you need to use, ../node_modules

9 ответов

Как отмечали другие, метод Object.assign() не поддерживается в IE, но имеется polyfill, просто включите его перед тем, ваше объявление плагина:

if (typeof Object.assign != 'function') {
  Object.assign = function(target) {
    'use strict';
    if (target == null) {
      throw new TypeError('Cannot convert undefined or null to object');
    }

    target = Object(target);
    for (var index = 1; index < arguments.length; index++) {
      var source = arguments[index];
      if (source != null) {
        for (var key in source) {
          if (Object.prototype.hasOwnProperty.call(source, key)) {
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };
}

Из https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

Страница тестирования http://jsbin.com/pimixel/edit?html,js,output (просто удалите polyfill, чтобы получить ту же самую ошибку, которую вы получаете на своей странице).

Andres Ilich
18 авг. 2016, в 15:56

Поделиться

@Джон Доу

Из вашего комментария я понял, что вы хотите реализовать это в стеке узлов/реагирования. Это сильно отличается от оригинального вопроса, и вы должны были задать свой собственный;)
В любом случае, вот что тебе нужно сделать…

Вы можете использовать [es6-object-assign] [1]. Это ES6 Object.assign() «polyfill».

Сначала в package.json в корневой папке добавьте es6-object-assign в качестве зависимости:

"dependencies": {
    "es6-object-assign": "^1.0.2",
    "react": "^0.12.0",
    ...
  },

Тогда, если вы хотите использовать его в среде узла, используйте:

require('es6-object-assign').polyfill();

Если у вас возникла проблема с интерфейсом (браузером)…
Добавьте его в свой файл index.html…

<script src="location_of_node_modules/es6-object-assign/dist/object-assign.min.js"></script>
<script>
  window.ObjectAssign.polyfill();
</script>

location_of_node_modules зависит от используемого вами шаблона, в основном это только node_modules, но иногда, когда index.html находится в подкаталоге, который вам нужно использовать, ../node_modules

shramee
20 авг. 2016, в 04:19

Поделиться

Возможное решение этой проблемы:

Добавьте script legacy.min.js перед custombox.min.js

source: проект gigaub custombox

aprovent
19 авг. 2016, в 15:11

Поделиться

@Андрес-Ильич имеет правильный ответ на ваш вопрос, но вы задаете неправильный вопрос:

Почему бы просто не использовать плагин jQuery, поддерживающий IE, как Zurb excellent Reveal: https://github.com/zurb/reveal

Он сделает все, что захочет, и не выбросит эту ошибку.

staypuftman
19 авг. 2016, в 21:03

Поделиться

В настоящее время работает над всплывающим окном jQuery:
https://github.com/seahorsepip/jPopup

Есть все, что вы ожидаете от всплывающего окна и больше: D

В любом случае, по теме, я в настоящее время пишу версию 2, которая является большой перепиской и добавляет поддержку IE6 (версия 1 была IE7 +) и столкнулась с аналогичной ошибкой…

Исходный код, который дал ошибку в IE6:

//Insane code for an insane browser
this._vars.fakeScrollbar = $("<div style="position:absolute;top:expression(document.documentElement.scrollTop);right:0;bottom:0;margin-left:-200px;width:0;overflow-y:scroll;height:expression(document.documentElement.clientHeight);z-index:9999999;"></div>");

Сбой, который я должен был придумать:

//Insane code for an insane browser
this._vars.fakeScrollbar = $("<div>");
this._vars.fakeScrollbar.html("<div style="position:absolute;top:expression(document.documentElement.scrollTop);right:0;bottom:0;margin-left:-200px;width:0;overflow-y:scroll;height:expression(document.documentElement.clientHeight);z-index:9999999;"></div>");
this._vars.fakeScrollbar = this._vars.fakeScrollbar.children();

seahorsepip
20 авг. 2016, в 16:05

Поделиться

Поскольку вы отметили вопрос с помощью jQuery, вы можете использовать функцию jQuery extend. Нет необходимости в polyfill, и он также глубоко объединяется.

Пример:

var object1 = {
  apple: 0,
  banana: { weight: 52, price: 100 },
  cherry: 97
};
var object2 = {
  banana: { price: 200 },
  durian: 100
};

// Merge object2 into object1
$.extend( object1, object2 );

Результат:

{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}

Kalimah Apps
04 янв. 2017, в 05:11

Поделиться

В принципе, Object.assign не поддерживается всеми браузерами, однако можно повторно назначить его в Object, если он не поддерживается текущим браузером.

Предпочитает сделать функцию polyfill, которая ведет себя так же, как Object.assign(target, ...) ES6.

Я думаю, что лучшим решением является итерация каждого аргумента после target, присваивание каждому свойству объектов arguments target, учитывая итерацию между объектами и массивами, чтобы избежать создания ссылок. Необязательно, чтобы не потерянные экземпляры, вы можете определить, равен ли последний экземпляр свойства только "Array" или "Object", и при этом вы не потеряете интерфейс Image (например), если вы планируете создавать новые ссылки, но объекты с этими экземплярами все равно будут ссылаться.

Изменить: исходный Object.assign не работает таким образом.

В соответствии с этим решением у меня есть свой polyfill, который можно найти здесь.

hydroper
20 авг. 2016, в 22:01

Поделиться

Ещё вопросы

  • 0Как уничтожить все элементы с помощью вкладок jQuery UI?
  • 0ошибки opencv при использовании с приложениями формы Windows
  • 0Как включить аргумент с API CreateProcess в VC ++?
  • 0asp: текстовое содержимое ярлыка не отображается как
  • 0PHP в JavaScript с помощью кнопки «Отправить»
  • 0не удается установить Dlib на Windows 10
  • 0Мусор в результате загрузки (Indy, Delphi 2009)
  • 1Клонировать массив с оператором распространения и добавить встроенный
  • 0Как выровнять навигационную панель по нижней части окна без зазора между кнопками и краем окна
  • 1получить количество страниц в текстовом документе, используя aspose
  • 0Правильный способ получения данных из многомерного массива
  • 1Как вручную добавить установщик в службу Windows?
  • 1Visual Studio 2017 Cordova & Android
  • 0Как исключить строки со значениями ‘0’, но не строки со значениями NULL в SQL?
  • 0Попытка создать функцию, где я могу искать в моей базе данных и получать результаты поиска. ошибки
  • 0Панель навигации MYSQL добавляет категорию в таблицу категорий, но проверяет, существует ли категория
  • 0Соединить две таблицы подзапроса
  • 0Я не могу сгенерировать автоинкрементный Id, а hibernate всегда генерирует 1 как Id
  • 0Выполнить код JS после завершения обратного вызова setTimeout ()
  • 1Как найти и разделить строковые значения в текстовых файлах, используя Java?
  • 1Python: передача функции в качестве параметра в классе
  • 0использование REGXP в MySQL для поиска и замены
  • 1Можно ли сериализовать и десериализовать объект, который содержит объект в качестве переменной в Firebase?
  • 1оператор if, включая hover () и ширину окна
  • 1Превратить arraylist из строки в arraylist
  • 0Как показать GridView во всплывающем окне jQuery с помощью GridView Paging?
  • 0Интеграция программы, написанной на C, с другой, написанной на C ++
  • 1Статические кнопки под ScrollView с динамическим расположением таблиц внутри
  • 0Правильное использование YouTube URL Regex
  • 0я хочу добавить два элемента в этот список из mysql
  • 0Как получить значение даты из защищенного массива?
  • 1Сортировка не работает в области базы данных в моем приложении
  • 0Нумерация страниц в PHP
  • 1Как получить XML-контент в виде строки
  • 1Модель связывания динамически в angular2
  • 0Какой быстрый способ добавить новые строки кода в начало и конец всех моих файлов?
  • 0уникальный указатель в связанном стеке
  • 0Изображения появляются в Chrome, но не в IE
  • 0Подсчет записей за каждый месяц, в том числе с нулевым результатом
  • 1Фильтрация результатов по пересечению коллекций?
  • 0Учебное пособие по Google Blobstore App Engine
  • 0Добавление файла в crontab через скрипт php
  • 0получить <image> src php для отображения в html
  • 0Проверка JQuery не запускается для флажков
  • 1поле ввода события Pygame
  • 1Понимание «побочных эффектов» в Javascript с учетом функций первого класса
  • 0Удалить дубликаты записей из таблицы, где идентификатор дублируется
  • 0Могу ли я инициализировать объект в списке инициализации другим членом класса?
  • 0Хранить объемные изображения в $ localStorage — Angular JS
  • 0MySQL имеет функцию заполнения (), когда я использую month () для заполнения данных?

Настроил webpack + babel следующим образом

webpack.config.js

...
  module: {
    rules: [
      {
        test: /.(js|jsx)$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      },
...

.babelrc

{
  "plugins": ["lodash", "transform-object-rest-spread"],
  "presets": [
    ["env", {
      "targets": [
        "> 4%",
        "ie 11",
        "safari 8"
      ]
    }],
    "react",
    "react-optimize"
  ],
  "env": {
    "test": {
      "presets": ["es2015", "react"]
    }
  }
}

Запускаю в chrom все ок, в IE 11 выдает ошибку

Объект не поддерживает свойство или метод «assign»

Объект не поддерживает свойство или метод assign

Ответы в сети вроде-бы есть но, ничего не помогло. Возможно слайдер swiper использует ES6

вот файл .babelrc

{
    "presets": ["@babel/preset-env"],
    "plugins": ["@babel/plugin-transform-object-assign"]
}

webpack.config.js

const path = require('path');

module.exports = {
	mode: process.env.NODE_ENV, // development не сжатый а продакшн сжатый
	entry: ['./scripts/main.js'],
	module: {
		rules: [
			{
				exclude: [/node_modules/(?!(swiper|dom7)/).*/, /.test.jsx?$/],
				test: /.jsx?$/,
				use: [{ loader: 'babel-loader' }],
			}
		]
	},
	output: {
		filename: '[name].js',
		path: path.resolve(__dirname, 'www/scripts')
	}
};

package.json

{
	"name": "gulp",
	"version": "1.0.0",
	"main": "index.js",
	"browserslist": [
		"> 1%",
		"not ie < 11",
		"not OperaMini all"
	],
	"license": "MIT",
	"scripts": {
		"dev": "cross-env NODE_ENV=development gulp dev",
		"build": "cross-env NODE_ENV=production gulp build"
	},
	"devDependencies": {
		"@babel/core": "^7.1.2",
		"@babel/plugin-transform-object-assign": "^7.8.3",
		"@babel/plugin-transform-property-mutators": "^7.8.3",
		"@babel/preset-env": "^7.1.0",
		"babel-loader": "^8.0.4",
		"browser-sync": "^2.24.7",
		"cross-env": "^5.1.5",
		"csso": "^3.5.1",
		"eslint": "^5.4.0",
		"gulp": "^4.0.0",
		"nunjucks": "^3.1.3",
		"postcss": "^7.0.2",
		"postcss-easy-import": "^3.0.0",
		"postcss-mixins": "^6.2.0",
		"postcss-nested": "^3.0.0",
		"postcss-object-fit-images": "^1.1.2",
		"postcss-preset-env": "^5.3.0",
		"prettier": "1.14.2",
		"request": "^2.88.0",
		"stylelint": "^9.4.0",
		"svg-sprite": "^1.4.0",
		"svgo": "^1.1.1",
		"webpack": "^4.23.1"
	},
	"dependencies": {
		"lozad": "^1.9.0",
		"object-fit-images": "^3.2.4",
		"svgxuse": "^1.2.6",
		"swiper": "^5.3.1",
		"web-animations-js": "^2.3.1"
	}
}

Понравилась статья? Поделить с друзьями:
  • Ошибка объект не найден outlook
  • Ошибка объект или свойство не найдено 0x80092004
  • Ошибка общим доступом подключения к интернету null
  • Ошибка общий ресурс в настоящее время не создан
  • Ошибка общие dll что это