2015-07-30 7 views
0

Я пытаюсь клонировать объект с закрытием. Пробовал angular.copy()Клонировать объект с закрытием

function Foo() { 
 
    var data; 
 

 
    this.x = function(val) { 
 
    if (val) { 
 
     data = val; 
 
    } 
 
    return data; 
 
    } 
 
} 
 

 
var a = new Foo(); 
 
var b = angular.copy(a); 
 

 
b.x(); // undefined 
 
a.x(5); // set x 
 
b.x(); // 5. expected undefined

+1

, что ваша проблема? a.x() не определено, так что также b.x(). Затем вы определяете a.x(), а так как b - динамическая копия, также установлено значение 5 – ted

+0

Все, что 'angular.copy()' будет делать, это скопировать ссылки. Он не может создать совершенно новое закрытие для версии этой функции, в которой существует эта функция. – Pointy

+0

Вы копируете функцию в 'a' в' b'. Это одна и та же функция, поэтому ссылки на одни и те же данные. Что случилось с 'var a = new Foo(), b = new Foo()'? Я не уверен, о чем вы просите. – 1983

ответ

1

Вы можете создать свой собственный clone метод вашего Foo объекта, если вы хотите. Вам просто нужно будет также клонировать любые соответствующие данные (если data f.e. является объектом, метод ниже просто сохранит ссылку на тот же объект).

function Foo() { 
 
    var data; 
 

 
    this.x = function(val) { 
 
    if (val) { 
 
     data = val; 
 
    } 
 
    return data; 
 
    } 
 
    this.clone = function() { 
 
    var n = new Foo(); 
 
    n.x(data); 
 
    return n; 
 
    } 
 
} 
 

 
var a = new Foo(); 
 
var b = a.clone(); 
 

 
a.x(5); // set x 
 
console.log("a.x: " + a.x()); // 5 
 
console.log("b.x: " + b.x()); // undefined

+1

Строка 'n.data = this.data;' будет путать, учитывая, что в объекте 'data' используется для ссылки на закрытую переменную, а не на свойство объекта. В принципе, используя предоставленный API (установив данные с помощью функции 'x'), строка будет по существу такой же, как« n.data = undefined; ». Я не думаю, что это вопрос, спрошенный/предполагаемый. – DRobinson

+0

Проще говоря, я думаю, что OP надеется скопировать закрытые значения, а не только выставленные значения. – DRobinson

+3

В 'this.clone':' n.x (data); ' – 1983

Смежные вопросы