Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как правильно клонировать объект, чтобы он оставался и при удалении исходника (https://javascript.ru/forum/misc/35278-kak-pravilno-klonirovat-obekt-chtoby-ostavalsya-i-pri-udalenii-iskhodnika.html)

Deff 06.02.2013 01:45

Как правильно клонировать объект, чтобы он оставался и при удалении исходника
 
Сабж...
var Obj_old={...}
var New_Obj ???

рони 06.02.2013 01:52

Deff,
http://javascript.ru/forum/misc/2271....html#post9011

danik.js 06.02.2013 01:54

Я вкурсе только про создание нового объекта и копирование в него всех свойств.

exports.copyObject = function(obj) {
    var copy = {};
    for (var key in obj) {
        copy[key] = obj[key];
    }
    return copy;
};

exports.deepCopy = function (obj) {
    if (typeof obj != "object") {
        return obj;
    }
    
    var copy = obj.constructor();
    for (var key in obj) {
        if (typeof obj[key] == "object") {
            copy[key] = this.deepCopy(obj[key]);
        } else {
            copy[key] = obj[key];
        }
    }
    return copy;
};


Это из https://github.com/ajaxorg/ace/blob/...ce/lib/lang.js

Думаешь есть что-то поинтереснее?

рони 06.02.2013 02:03

var b = {a: 123};
var a =  JSON.stringify(b);
a =  JSON.parse(a);
b = null;
alert(a.a);

Deff 06.02.2013 02:19

рони,danik.js, Спс

Мож еще devote подскажет(или B@rmaley.e><e
Cвойства исходника могут быть и приватные и вложенные ...

Разбираюсь пока... Задача клонировать фреймворк

danik.js 06.02.2013 02:19

рони, действительно, интересно. Не во всех случаях подходит коечно, но когда нужно быстро сделать копию, без всяких вспомогательных функций - самое то. В хроме работает где-то в 2 раза медленней чем клон через копирование свойств.

Deff 06.02.2013 02:31

:blink: Пока работает:
var b = {a: {a: 123}};
var a =  JSON.stringify(b);
a =  JSON.parse(a);
b = null;
alert(a.a.a);

var b = {a: {a: {a: 333}}};
var a =  JSON.stringify(b);
a =  JSON.parse(a);
b = null;
alert(a.a.a.a);

var b = {a: {a: {a: alert(333)}}};
var a =  JSON.stringify(b);
a =  JSON.parse(a);
b = null;
a.a.a.a;


var b = {a: {a: {a: (function(){alert(333)}())}}};
var a =  JSON.stringify(b);
a =  JSON.parse(a);
b = null;
a.a.a.a;

danik.js 06.02.2013 02:43

http://jsperf.com/deep-object-copy-vs-json

Вот еще, но тут хренотень какая то. http://jsperf.com/cloning-an-object/54
Какой еще ES5 Object.clone ...

danik.js 06.02.2013 02:53

Цитата:

Сообщение от Дзен-трансгуманист
Што-што?

Сделаем вид что Deff имел ввиду плюшки ES6 Harmony ))

Deff 06.02.2013 03:03

Дзен-трансгуманист,
http://javascript.ru/tutorial/events/crossbrowser
Цитата:

Мини-библиотечка Event будет представлять собой синглтон с несколькими приватными и двумя публичными функциями:

Deff 06.02.2013 03:13

Цитата:

Сообщение от Дзен-трансгуманист
А как вы собираетесь клонировать замыкания, а?

Пока не думал - разбираюсь
Начали с чистых объектов... потом вложенные, потом функции
--------------------------------------------------------------
Суть в том - что брауз как то клонирует и фреймворк тоже

Deff 06.02.2013 04:22

Обман зрителя с псевдоклонированием фреймворка

1. Ставим скрипт библиотеки во фрейм,
2. ...якобы клонируем frame1.jQuery
3. Удаляем фрейм вместе со скриптом (можно наблюдать удаление - cпецом

Запускаем любые jQuery функции (тут считываю bоdy.html() ( Заметим что фрейма нет)
//Чисто коперфильд (Сам заю, что вру и где
//а хочется реально!
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
</head>
<body>

<script>

function TestLibFrame() { // 

  function Clone(a) {
    return a;
  }

  window.docThis = frame1.parent.document;
  window.$$ =  Clone(frame1.jQuery); //...якобы клонируем frame1.jQuery
  delete frame1.jQuery;//alert(frame1.jQuery); //...удаляем объект frame1.jQuery

  $$("iframe[name='frame1']",docThis).remove(); //Удаляем фрейм...

  var str = 'Запускаем jQuery на  странице без библиотеки:';
  alert(str +'\n\n' + $$("html",docThis).html());

}  


function Funk0(aa) {
var a='Cтавим javascript - библиотеку во фрейм'
var iframe = aa
var iframeDoc = iframe.contentWindow.document;
var b = iframeDoc.createElement('div');
b.innerHTML=a;//alert(b.innerHTML)
iframeDoc.body.appendChild(b);
var s = iframeDoc.createElement('script');
s.setAttribute("type","text/javascript");
s.src = "http://yandex.st/jquery/1.4.4/jquery.min.js";
//s.setAttribute("onload","parent.TestLibFrame()");
s.onload = function () {setTimeout("TestLibFrame()",4000);}
b.appendChild(s);
}

</script>
<iframe name=frame1 onload="Funk0(this)"></iframe>


</body>
</html>


Часовой пояс GMT +3, время: 03:23.