MessageChannel
MessageChannel的基本使用
const {port1, port2} = new MessageChannel();
port1.onmessage = function(d) {
    console.log(`port1接收的消息是:${d.data}`);
}
port2.onmessage = function(d) {
    console.log(`port2接收的消息是:${d.data}`);
}
port1.postMessage('port1发送的消息');
port2.postMessage('port2发送的消息');
port1发送的由port2接收,port2发送的由port1接收。
也就是说,传过去的对象,接收到的时候已经不是原来的引用和指针了,这个时候再return出来,就是一个新的对象,所以肯定能实现深拷贝。
使用MessageChannel实现深拷贝
var obj = {id:1,name:{a:'xx'}};
function structuralClone(obj) {
    return new Promise((resolve) => {
        const {port1, port2} = new MessageChannel();
        port2.onmessage = ev => resolve(ev.data);
        port1.postMessage(obj);
    })
}
structuralClone(obj).then(res=>{
    console.log(res);
    var obj3 = res;
    obj3.name.a = 'obj3';
    console.log(obj,obj3);
})
<!-- 用promise是为了好传数据 -->
    种一棵树最早的时间是十年前,其次是现在。
                    
                
                
            
        
浙公网安备 33010602011771号