apply:
Function.prototype.myapply=function(content){
var content=content||window //判断this对象
content.fn=this //这个this指向的是array.push函数
console.log(arguments[0])//[a,b]
console.log(arguments[1])[0,1,2]
var result=arguments[1]?content.fn(...arguments[1]):content.fn()
delete content.fn
return result
}
var array = ['a', 'b'];
var elements = [0, 1, 2];
array.push.myapply(array, elements);
console.info(array); // ["a", "b", 0, 1, 2]
call:
Function.prototype.mycall=function(){
var content=content||window
content.fn=this
console.log(content)//window
console.log(content.fn) // ƒ display() {console.log('sData value is %s ', this.sData);}
console.log(arguments)//{ species: 'Lion', name: 'King' }, { species: 'Whale', name: 'Fail' }
var arg=[...arguments].splice(1)
var result=content.fn(...arg)
delete content.fn
return result
}
var animals = [
{ species: 'Lion', name: 'King' },
{ species: 'Whale', name: 'Fail' }
];
for (var i = 0; i < animals.length; i++) {
(function(i) {
this.print = function() {
console.log('#' + i + ' ' + this.species
+ ': ' + this.name);
}
this.print();
}).mycall(animals[i], i);
}
bind
Function.prototype.mybind=function(context){
if(typeof this !=='function'){
throw new TypeError(this+'is not function')
}
var that=this //保存this
var arg=[...arguments].splice(1)
return function F (){
console.log(this)
if(this instanceof F){
return new that(...arg,...arguments)
}else{
return that.apply(context,arg.concat(...arguments))
}
}
}