オリジナルjsオブジェクトを統合してObject.assignをコピーする方法のes 5、es 6が実現します.

2641 ワード

構想を実現します:es 6のブラウザーを支持して、直接Object.assign()を使ってオブジェクトを合併することができて、es 5のブラウザーだけを支持して、私達はpollyfillの方法を使います.
 
作用
Object.assign()メソッドは、1つ以上のソースオブジェクトのエニュメレート・属性値を対象オブジェクトにコピーし、値を対象とするオブジェクトを返します.
構文
Object.assign(target, ...sources)
パラメータ
ターゲットオブジェクトsources:ソースオブジェクト
戻り値
オブジェクト
 
説明
Object.assignメソッドは、ソースオブジェクトの列挙可能な属性とオブジェクト自身の属性のみをコピーします.ソースオブジェクトに[[Get]]を使い、ターゲットオブジェクトに[[Set]を使用すると呼び出します. getter 和 setterこれはgetterを含むオブジェクトの属性を一つのプロトタイプに統合するのに適していません.属性定義をエニュメレート・プロトタイプにコピーするには、使用するべきです. Object.getOwn PropertyDescripter() 和 Object.defineProperty() 方法
String 和 Symbol タイプの属性はすべてコピーされます.
エラーが発生した場合、たとえば書き込み不可の属性があります. Type Error エラー、オブジェクトはそのままです.
注意 Object.assign() 元のオブジェクトは null または undefined 間違いないです
jianの例
オブジェクトをクローン
var obj = {a: 1};
var copy = Object.assign({}, obj);
console.log(copy); // {a: 1};
オブジェクトを結合
var o1 = {a: 1};
var o2 = {b: 2};
var o3 = {c: 3};

var obj = Object.assign(o1, o2, o3);
console.log(obj); //{a: 1, b: 2, c: 3}
console.log(o1); //{a: 1, b: 2, c: 3},         
ES 5バージョンの実装方法
/**
     *     polyfill
     * */
    function zyEs6AssignPolyfill() {
        if (!Object.assign) {
            Object.defineProperty(Object, "assign", {
                enumerable: false,
                configurable: true,
                writable: true,
                value: function (target, firstSource) {
                    "use strict";
                    if (target === undefined || target === null)
                        throw new TypeError("Cannot convert first argument to object");
                    var to = Object(target);
                    for (var i = 1; i < arguments.length; i++) {
                        var nextSource = arguments[i];
                        if (nextSource === undefined || nextSource === null) continue;
                        var keysArray = Object.keys(Object(nextSource));
                        for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
                            var nextKey = keysArray[nextIndex];
                            var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
                            if (desc !== undefined && desc.enumerable) to[nextKey] = nextSource[nextKey];
                        }
                    }
                    return to;
                }
            });
        }
    }
参考文献:http://www.cnblogs.com/heiye168/p/5689006.html