扩展的一个小问题

我一直从事移动终端最近,因为我熟悉jQuery,加Zepto提供的API为jQuery一样,我选择了Zepto作为开发框架。

由于移动终端的发展,一些新的ES5的API,如foreach,也用。下面是我编写的代码的一些示例。


list.foreach(功能(v){)
返回!!V;
})




我天真的以为,就像是jQuery的每。只要我的返回值是false,它就会中断循环。所以,有很多这样的代码遍历。

经过一段时间的写作,我突然意识到,每一个回调函数不能中断周期。所以我挂了一个功能简单的array.prototype,然后是完美的。


array.prototype.foreach =功能(Fn){
var i = 0,len = this.length;

为了(;;我;

如果(FN { },i)= false){
打破;
}
}
};




直到有一天,我想做一些优化,同时考虑到客户端需要保存的JSON。(不骗你,可以去20m),当stringify太费时,它会阻塞UI,所以我使用工作在后台打开一个线程,设计stringify JSON,这样看:

复制代码代码如下所示:

AddEventListener(消息

VaR数据= e.data;

数据json.stringify(数据);

PostMessage(数据);

},假);



PosMesage:

复制代码代码如下所示:

worker.postmessage(数据)



但是控制台输出以下错误信息:

复制代码代码如下所示:

捕获的datacloneerror:未能execute'postmessage'on'worker:对象不能



作弊,这该死的为什么连一个JSON拷贝它们,所以我开始找个理由,让我在这个东西里面找到我的JSON:



哦,这是什么,这就是为什么每个进来的时候,我看着里面的$编辑。延长(真的,obj { })我不知道有没有颤抖,不是你的麻烦。所以,我看美元的来源。延伸:


函数扩展(目标,源,深){
对于(源代码中的键)
如果(深(isplainobject(来源{key})| | ISArray(来源{key}))){
如果(isplainobject(源{重点})!isplainobject(目标{key}))
目标{键} }
如果(ISArray(源{重点})!ISArray(目标{key}))
目标{键} }
扩展(目标{键},源{键},深)
}
否则如果(源{键}!=未定义)目标{ } }
}

从一个或多个复制所有未定义的属性
指向'目标'对象。对象
$ =函数(目标){
无功深,args = slice.call(参数1)
如果(typeof目标= = 'boolean){
深=目标
目标= args.shift()
}
args.foreach(功能(arg){延伸(目标、精氨酸、深)})
将目标
}




我的天啊,这真的是及时的货吗…在..是偶数,但如果是(源{键})!= =定义的)目标{key} =源{key},病情严重者可啊,添加hasownproperty检查不浪费太多时间。充满泪水

的Zepto坑后,我立即去了jQuery的抱怨,我希望它能安慰我,我不想:


jquery.extend = jquery.fn.extend =函数(){()
VaR的选项,名字,SRC,复制,copyisarray,克隆,
目标=论点{ 0 } | | { },
我= 1,
长度= arguments.length,
深=假;

深拷贝情况
如果(typeof目标=布尔){
深=目标;
目标=论点{ 1 } | | { };
布尔值和目标跳过
我= 2;
}

当目标是字符串或其他东西时(可能是深拷贝)
如果(typeof = =对象的目标!jquery.isfunction!(目标){
目标{ };
}

如果只传递一个参数,则扩展jQuery本身。
如果(长度= i){
目标=此;
——我;
}

为(;;i;<长度;i + +){
处理非空的/未定义的值
如果((选项=参数{ })!= NULL){
基本对象扩展
对于(选项中的名称){
目标= { };
复制=选项{名称};

永不终止循环
如果(目标=复制){
继续;
}

递归如果我们合并普通的对象或数组
如果(深拷贝(jquery.isplainobject(复印件)| |(copyisarray = jquery.isarray(副本)))){
如果(copyisarray){
copyisarray = false;
钢骨混凝土(SRC)克隆= jquery.isarray SRC:{ };

{人}
钢骨混凝土(SRC)克隆= jquery.isplainobject SRC:{ };
}

移动原始的 /不存在对象,克隆它们
{姓名} =目标jquery.extend(深、克隆、复制);

输入未定义的值
否则如果}(副本)!=未定义的){
目标{ } =复制;
}
}
}
}

修改后的对象返回
将目标;
};




这是其他的(如果)!=未定义){目标} =复制;}由于我的母亲,啊。

最后,他不得不写一封信。

总结:当你想用美元。延伸,不要把你的自定义属性和方法对array.prototype和object.prototype。否则,以后可能会去窃听。

以上是本文的全部内容,希望大家能喜欢。