如何在所有浏览器中保持类似的行为?

时间:2017-08-01 09:59:33

标签: javascript browser

我遇到了Object.assign函数,我使用它将两个对象合并为一个,但javascript在旧浏览器上不起作用,我如何确保它适用于所有浏览器?

它在chrome上工作正常。

我的代码与此类似,

function getConfig(){
   var config = { a: 4};
   var envConfig = {a:2, b:6};
   return Object.assign({}, config, envConfig);
}
console.log(getConfig());

4 个答案:

答案 0 :(得分:2)

总有一种复古的方式。这是两个:

1)通过jQuery

jQuery通过其$.extend()方法提供相同的功能,即

var newObj = $.extend({}, oldObj1, oldObj2);

2)via loops(这大致就是jQuery在幕后所做的)

var newObj = {};
[oldObj1, oldObj2].forEach(function(oldObj) {
    for (var prop in oldObj) newObj[prop] = oldObj[prop];
});

答案 1 :(得分:1)

嗯,我在开发过程中也遇到过这样的问题。

您可以使用填充程序库轻松解决此错误。这提供了IE 11中可用的Javascript对象。

以下链接对我有用。

https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.7/es5-shim.min.js

https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.2/es6-shim.min.js

以上两个链接将帮助您在IE浏览器中获取所有Javascript对象属性。

由于

答案 2 :(得分:1)

Object.assign由ES2015定义。在此之前发布的浏览器(可能在它之后不久)就没有了。例如,这包括IE的所有版本。

特定功能可以填充;我在下面引用MDN's polyfill

在一般情况下:如果您需要支持不具备现代功能的旧版浏览器(我们很多人都这样做),您需要:

  1. 不使用他们没有的功能,或

  2. 使用polyfill和转换器(例如Babel)将使用这些功能的源代码转换为可以在不支持它们的旧浏览器上运行的内容。

  3. 在撰写本文时,这是polyfill(我只修复了两个小错误):

    if (typeof Object.assign != 'function') {
      // Must be writable: true, enumerable: false, configurable: true
      Object.defineProperty(Object, "assign", {
        value: function assign(target, varArgs) { // .length of function is 2
          'use strict';
          if (target == null) { // TypeError if undefined or null
            throw new TypeError('Cannot convert undefined or null to object');
          }
    
          var to = Object(target);
    
          for (var index = 1; index < arguments.length; index++) {
            var nextSource = arguments[index];
    
            if (nextSource != null) { // Skip over if undefined or null
              for (var nextKey in nextSource) {
                // Avoid bugs when hasOwnProperty is shadowed
                if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
                  to[nextKey] = nextSource[nextKey];
                }
              }
            }
          }
          return to;
        },
        writable: true,
        configurable: true
      });
    }
    

答案 3 :(得分:1)

Object.assign()仅适用于ECMAScript 2015(第6版,ECMA-262)。 参考:http://www.ecma-international.org/ecma-262/6.0/#sec-object.assign

您可以在旧版本的ECMAScript中使用pollyfill。

Babel为此提供了一个很好的选择。您可以在此处找到有关如何使用它的明确说明:https://babeljs.io/docs/plugins/transform-object-assign/