Function.prototype.myCall = function (obj) {
var obj = obj || window
//var flag = false, temp
//if (obj.hasOwnProperty('fn')){
// flag = true;
// temp = obj.fn
//}
obj.fn = this
var args = []
for (var i = 1; i < arguments.length; i++)
args.push('arguments[' + i + ']')
var result = eval('obj.fn(' + args + ')')
delete obj.fn
//if (flag)
// obj.fn = temp
return result
}
new
實現思路:新建空對象、讓對象的 __proto__ 指向函數的 prototype、執行構造函數、返回該對象
細節修正:如果構造函數返回的值是對象或函數,則返回構造函數返回的對象或函數
function objectFactory() {
var obj = new Object()
var Constructor = Array.prototype.shift.call(arguments)
obj.__proto__ = Constructor.prototyep
var ret = Constructor.apply(obj, arguments)
return (typeof ret === 'object' || typeof ret === 'function') ? ret : obj
}