87,910
社区成员
发帖
与我相关
我的任务
分享
<script type="text/javascript">
//对象深拷贝函数
var cloneAll = function (o){
function clonePrototype(){}
clonePrototype.prototype = o;
var obj = new clonePrototype();
for(var elements in obj){
if (typeof(obj[elements]) == "object") {
obj[elements] = cloneAll(obj[elements]);
}
}
return obj;
}
var obj = {
m : {o : {l : 1}, p : 1},
n : 2
}
var test = cloneAll(obj);
function del(attr, o) {
delete o[attr];
}
del('m', test);
for (var attr in test) {
alert('test : ' + attr + ' ' + test[attr]);
}
del('m', obj);
for (var attr in obj) {
alert('obj : ' + attr + ' ' + obj[attr]);
}
</script>
<script type="text/javascript">
var cloneAll = function (o){
function clonePrototype(){}
clonePrototype.prototype = o;
var obj = new clonePrototype();
for(var elements in obj){
if (typeof(obj[elements]) == "object") {
obj[elements] = cloneAll(obj[elements]);
}
}
return obj;
}
var obj = {
m : {o : {l : 1}, p : 1},
n : 2
}
var test = cloneAll(obj);
function del(attr, o) {
delete o[attr];
}
del('m', obj);
for (var attr in obj) {
alert('obj : ' + attr + ' ' + obj[attr]);
}
del('m', test);
for (var attr in test) {
alert('test : ' + attr + ' ' + test[attr]);
}
</script>
function deepClone(obj){
var result = {};
for(var p in obj){
if(obj[p] instanceof Array){
result[p] = obj[p].slice();
continue;
}
if(obj[p] && typeof obj[p] == "object"){
result[p] = arguments.callee.call(null, obj[p]);
continue;
}
result[p] = obj[p];
}
return result;
}
var b = {name: 'ethan'};
var a = cloneAll(b)
//代码执行到这里的时候, 对象b成为对象a构造函数的原型链
// clonePrototype.prototype = o;
// var obj = new clonePrototype();
// 由这两行代码实现
delete a.name
//删除对象a的name属性 (其实对象a本身不存在name属性,name属性存在于a的构造函数原型中,即对象b)
alert(a.name)
//查询对象a的name属性,没找到,于是去对象a构造函数的原型(即b)中查询,找到name属性,返回'ethan';
function F(){}
F.prototype = {list: []}
alert((new F).list === (new F).list)
alert([] === [])
// 删除test.m 以后
del('m', test);
// 改变test的原型链到默认Object上。。但是以后和obj就一点关系都没有了
test.constructor.prototype = new Object();
test.constructor = Object;
代码1
// 理解当前object和原型链的关系,好像 你父亲的钱 和 你的钱
del('m', test);
// 你的钱花完了,不代表你父亲的钱花完了
for (var attr in test) {
alert('test : ' + attr + ' ' + test[attr]);
}
// 你父亲的钱也花完了,你们家开始穷了
del('m', obj);
for (var attr in obj) {
alert('obj : ' + attr + ' ' + obj[attr]);
}
// 代码2
// 你父亲的钱没有了,仅代表你不能再继承你父亲的家产了
del('m', obj);
for (var attr in obj) {
alert('obj : ' + attr + ' ' + obj[attr]);
}
// 你的钱花完了 又不能从你父亲那里拿钱,只能受穷了
del('m', test);
for (var attr in test) {
alert('test : ' + attr + ' ' + test[attr]);
}
// 你觉得你既然是你父亲的儿子,你花完钱了,那么(在你父亲有钱的前提下)你不想继承你父亲的钱,这合理吗?
// 答案很简单,只要你不是你父亲的儿子就可以实现
// 同理,只要不用原型链,仅对象复制可以实现你要的效果
for(var elements in o){ // 而不是用你的克隆对象实现
}