首先 
var a={w:'www'}
var b=a
b.w="sss"
alert(a.w)//也被改变  弹出sss第一种方案是这样
function $type(x){
if(typeof x=='object'){
if(x instanceof Array){
return 'array'
}else if(x instanceof Function){
return 'function'
}else{
return 'object'
}
}else{
return typeof x
}
}function $unlink(object){
var unlinked;
switch ($type(object)){
case 'object':
unlinked = {};
for (var p in object) unlinked[p] = $unlink(object[p]);
break;
case 'array':
unlinked = [];
for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]);
break;
default: return object;
}
return unlinked;
};var a={w:"www"}
var b=$unlink(a)
b.w="sss"
alert(a.w)//没有被改变 弹出www第2中方案是mootools中的方案  原理是这样的
var w={w:"www"}var a=function(){}
a.prototype=w 
var aa=new aaa.w="sss"
alert(w.w)//没有改变w.w,还是原来的www但是它写的方法却让我很困惑  因为实现不了 接触关联
看看它的代码吧
function $type(x){
if(typeof x=='object'){
if(x instanceof Array){
return 'array'
}else if(x instanceof Function){
return 'function'
}else{
return 'object'
}
}else{
return typeof x
}
}var w={w:'wwww'}
var reset = function(object,key){
    
    if (key == null) {
        for (var p in object) reset(object, p);
        return object;
    }
delete object[key];//这为什么要delete啊??而且delete不了prototype上的属性 我晕~
switch ($type(object[key])){
case 'object':
var F = function(){};
F.prototype = object[key];
var i = new F;
object[key] = Object.reset(i);//
break;
}
return object
}
var b=reset(w)
b.w="sss"
alert(w.w)//w.w的值被改变为 sss虽然它的结果不对 但是对思想我还是觉得很对的? 请问大家 为什么不能分开关联呢? 哪错了?reset也在下面这种情况下 调用
var a=function(){
reset(this)
return this
} 不解 为什么mootools要这么做

解决方案 »

  1.   

    趁服务器重启开了下.delete object[key];//这为什么要delete啊??而且delete不了prototype上的属性 我晕~这个好像提前了.删除了后就全是undefined了...
    是么?
      

  2.   

    哦  reset方法好像是删除原来的引用用的 
    看个例子
    function $type(x){
    if(typeof x=='object'){
    if(x instanceof Array){
    return 'array'
    }else if(x instanceof Function){
    return 'function'
    }else{
    return 'object'
    }
    }else{
    return typeof x
    }
    }var w={w:'wwww',a:{a:"aaaa"}}
    var reset = function(object,key){
        
        if (key == null) {
            for (var p in object) reset(object, p);
            return object;
        }
    delete object[key];//

    switch ($type(object[key])){
    case 'object':
    var F = function(){};
    F.prototype = object[key];
    var i = new F;
    object[key] =reset(i);//上面这个地方写错了 Object.reset应为reset
    break;
    }
    return object
    }
    reset(w)
    for(var i in w)
    alert(i)//什么都没了但是 小弟认为可以更简单些的
    var w={w:'wwww',a:{a:"aaaa"}}
    var reset = function(object,key){
        
        if (key == null) {
            for (var p in object) reset(object, p);
            return object;
        }
    delete object[key];//

    switch ($type(object[key])){
    case 'object':reset(object[key]);//这样不就行了???mootools在舍近求远???还是另有他情???
    break;
    case 'array': object[key] = $unlink(object[key]); break;//mootools里还有这行
    }
    return object
    }
    reset(w)
    for(var i in w)
    alert(i)//也清除完了不清楚有什么不同  还请高手指点迷津
      

  3.   

    我依照var F = function(){};
                F.prototype = object[key];
                var i = new F;
                object[key] =reset(i);
    这样的调用方法,自己分解开
    形成了下面的代码  小弟认为和上面的原理 应该是一样的  但是为什么结果不一样呢????var w={w:'wwww',a:{a:"aaaa"}}
    var a=function(){}
    a.prototype=w.a
    var aa=new adelete aa.a//这样不能删除  但为什么上面的模式能删除呢???
    alert(aa.a)//aaa
    w.a=aa
    alert(w.a.a)//弹出aaa
      

  4.   


    老兄,对象属性,{a:....},跟prototype 过来的属性没有可比性,
    通过prototype 过来的属性是不能被删除的
      

  5.   

    4楼的
     switch ($type(object[key])){
            case 'object':reset(object[key]);//这样不就行了???mootools在舍近求远???还是另有他情???
            break;
            case 'array': object[key] = $unlink(object[key]); break;//mootools里还有这行
        }
    始终是没有用的啊...
    我觉得是放错位置了吧...不过要知道他reset的本意.