bind/new/instanceof/assign模擬實現

鬧鬧不愛鬧發表於2018-11-12

Function.prototype.bind2 = function(context) {
    const args = Array.prototype.slice.call(arguments, 1); // 獲取除繫結的this引數之外的其他引數
    const self = this;
    var fBind = function() {
        return self.apply(this instance fBind ? this : context, args.concat(Array.prototype.slice.call(arguments))); 
        // this instance fBind ? this : context為判斷fBind是否作為建構函式呼叫,如果是則將this指向例項,否則this指向context引數。
    }
    fBind.prototype = Object.create(self.prototype);
    return fBind;
}
複製程式碼

// new 為關鍵字,只模擬功能實現,不模擬具體呼叫,最後呼叫為new2(constructor, params1, params1);
function new2() {
    var constructor = Array.prototype.shift(arguments); // 獲取建構函式,並且shift會改變arguments
    var obj = new Object();
    obj.__proto__ = constructor.prototype; // 加入原型鏈
    var result = constructor.apply(obj, arguments);
    return typeof result === 'object' ? result : obj; // 構造如果顯示return一個物件,則返回該物件,否則返回this;
}複製程式碼

// instanceof(x, y)
function instanceof(x, y) {
    while(x.__proto__!==null) {
      if(x.__proto__===y.prototype) {
          return true;
          break;
      }
      x.__proto__ = x.__proto__.proto__;
    }
    if(x.__proto__==null) {return false;}
}複製程式碼

// Object.assign
Object.defineProperty(Object, assgin2, {
    wirte: true,
    configurable: true,
    enumerable: false,
    value(target) {
        if (target == null) throw new TypeError('Cannot convert undefined or null to object');
        const results = typeOf target === 'Object' ? target : Object(target);
        if (arguments.length > 1) {
            for (let i = 1; i < arguments.length; i += 1) {
                const arg = arguments[i];
                if (arg !== null) {
                    const obj = typeOf arg === 'Object' || 'Function' ? arg : Object(arg); // 簡單型別會被包裝成物件型別
                    for (const k in obj) {
                        if (Object.prototype.hasOwnProperty(obj, k)) {
                            results[k] = obj[k]
                        }
                    }
                }
            }
        }
        return results;
    }
})複製程式碼


相關文章