8,apply call

for (var i = 0, len = arr2.length; i < len; i += QUANTUM) {
        Array.prototype.push.apply(
            arr1, 
            arr2.slice(i, Math.min(i + QUANTUM, len) )
        );
    }

Math.min(1,2,0,-9)
或者
var array=[2,7,5,8,9];
Math.min.apply(null,array); or Math.min.apply(Math, array)
arguments是数组类对象,不能直接使用数组的方法,需要转一次
Array.prototype.slice.call(arguments)
或
[ ].slice.call(arguments)

ES6则直接提供了Array.from(arguments) 或 [...arguments] 可遍历的对象

继承:只能继承实例属性,不能继承原型属性。复制副本也影响性能
SuperType.call(this);
new SubType() 
var foo = {value:1}
var bar = function(){console.log(this.value)}
bar.call(foo) // 这给foo额外绑定了一个函数

Function.prototype.call2 = function(context){
  context.fn = this;
  context.fn();
  delete context.fn;
}
bar.call2(foo); // 扩展Function的方法,但是没法给bar传参

Function.prototype.call3 = function(context){
  context = context ? Object(context) : window;
  context.fn = this;
  for(arguments){
    argArr.push('arguments[' + i + ']')
  }
  val result = eval("context.fn(argArr)")
  delete context.fn;
  return result;
}
如果是es6的话,可以直接
  let args = [...arguments].slice(1);
  let result = context.fn(...args);


apply的原理,同理。注意参数的区别就可以了。
判空 + context.fn(...arr);

你可能感兴趣的:(8,apply call)