看代码之前,你必须了解this动态绑定特性
Function.prototype.bindN = function(context){
var self = this;
return function(){
context.fn = self;
context.fn();
delete context.fn;
}
}
Function.prototype.callN = function(context){
var self = this;
context.fn = self;
context.fn();
delete context.fn;
}
var obj = {
birth:100,
fun:function(){
return function(){
console.log(this.birth);
}.bindN(obj)
}
}
obj.fun()()
// console.log(obj)
/*使用callN*/
var obj2 = {
birth:0,
fun:function(){
return function(){
console.log(this.birth);
}
}
}
obj2.fun().call(obj2)
//现在综合一下
obj.fun().call(obj2)//猜猜怎么执行的
相当于obj2.obj.fun()();//可能不准确,但抛出砖头了就好
下面是一个数组的深度拷贝(没有测试太多栗子),采用递归处理
var arr = [
{age:5,name:"mark"},
[[1,2,3],4,5]
];
//数组拷贝方法
function arrayCopy(arr_src,arr_dst=[]){
//第二个参数可选
for(var i=0;i<arr_src.length;i++){
if(arr_src[i] instanceof Array){
arr_dst[i] = arrayCopy(arr_src[i]);
}else if(arr_src[i] instanceof Object){
arr_dst[i] = objCopy(arr_src[i])
}else {
arr_dst[i] = arr_src[i];
}
}
return arr_dst;
}
//对象(json)拷贝方法
function objCopy(obj_src,obj_dst={}){
//第二个参数可选
for(var i in obj_src){
if(obj_src[i] instanceof Array){
obj_dst[i] = arrayCopy(obj_src[i]);
}else if(obj_src[i] instanceof Object){
obj_dst[i] = objCopy(obj_src[i])
}else{
obj_dst[i] = obj_src[i];
}
}
return obj_dst;
}
var newArr = arrayCopy(arr);
// console.log(newArr)
///最终目的是达到修改新数组,原数组不受影响
newArr[0].age=100;
newArr[1][0] = 1;
console.log(newArr)
console.log(arr)
上述栗子的简化版
function objCopy(obj_src,obj_dst={}){
//第二个参数可选
for(var i in obj_src){
if(obj_src[i] instanceof Object){
obj_dst[i] = objCopy(obj_src[i])
}else{
obj_dst[i] = obj_src[i];
}
}
return obj_dst;
}
Array的原型方法splice的实现
Array.prototype.spliceN = function(location,count = 0,args){
var self = this;
//不计算locatio和count的数量
var argsLen = arguments.length-2;
//用于判断是否找到了位置
var bFlag = false;
var i;//循环变量
/**********删除操作*********/
for(i = 0; i < self.length; i++){
if(i == location){
bFlag = true;
}
if(bFlag){
// self[i+count]? self[i] = self[i+count]:delete self[i];
self[i] = self[i+count];
}
}
/**********数组长度手动修改*********/
self.length -= count
// console.log(self.length)
/**********插入操作(分两步)*********/
/***********给新数据腾出空间**********/
for(i = (self.length += argsLen)-1;i>=location;i--){
self[i] = self[i-argsLen];
}
/**********把参数添加进相应位置*********/
for(i = 0;i<argsLen;i++){
self[location+i] = arguments[i+2]
}
}