2014-10-03 2 views
0

보안을 위해 "미러 된"객체가 필요합니다. 즉 객체 A를 만들고 A의 사본을 얕은 사본으로 만들고 B를 호출하면 A의 속성이 변경 될 때마다 B가 자동으로 변경 사항을 반영하도록 업데이트하지만 다른 방법은 반영하지 않기를 바랍니다. 즉, 단방향 속성 동기화입니다.JavaScript 객체 미러링/단방향 속성 동기화

내 질문 : 이미 알고있는 야생에 해결책이 있습니까?

observe-js (https://github.com/polymer/observe-js)로 라이브러리를 구현할 생각 이었지만 계속 진행하기 전에 질문해야한다고 생각했습니다. 감사.

+0

어떤 대상 환경을 지원해야합니까? 특히 IE8 및 이전 버전을 지원해야합니까? –

+0

여하튼, 이것은 "prototype"속성의 영리한 사용을 통해 달성 될 수있는 것처럼 느껴지지만 어떻게 확신 할 수는 없습니다. – Katana314

+0

@ Katana314 : 그 문제는 나중에 B에 질문 할 때 B에 쓰는 것이 A의 값을 숨기는 것입니다. 내가 생각하기에 OP가 원하는 것은 아니지만 OP가 묻고 실행하는 것 같습니다 ... –

답변

1

IE8 이하를 지원할 필요가 없다고 가정하면 최신 브라우저에서 게터를 사용할 수 있습니다.

function proxy(src) { 
    var p = {}; 
    Object.keys(src).forEach(function(key) { 
    Object.defineProperty(p, key, { 
     get: function() { 
     return src[key]; 
     } 
    }); 
    }); 
    return p; 
} 

var a = { 
    foo: "Original foo", 
    bar: "Original bar" 
}; 
var b = proxy(a); 

console.log(b.foo); // "Original foo" 
a.foo = "Updated foo"; // Note we're writing to a, not b 
console.log(b.foo); // "Updated foo" 
+0

이 솔루션이 객체 'b'를 'a'와 동기화하는 것처럼 보이지 않습니다. 예를 들어 브라우저 콘솔에서 코드를 실행 한 후'a.foo = "foo"'를 업데이트하면'b.foo'는 원래 foo "와 동일하게 유지됩니다. – settinghead

+1

@settinghead : 저를 위해 일하십시오 : http://jsbin.com/yowiri/1 (순간적으로 스택 스 니펫이 작동하지 않는 것처럼 보입니다 ...) –

+0

이 솔루션을 사용하면'a'가 새 속성을 얻으면, 그것은'b'에 나타나지 않을 겁니다, 그렇죠? –

0

을 설정할 수 있습니다 이것에 대한 프로토 타입 체인 :

var a = {}; 
var Syncer = function(){}; 
Syncer.prototype = a; 
var b = new Syncer(); 

a.foo = 123; 
b.foo; // 123 

b.bar = 456; 
a.bar // undefined 

직접 a입니다 프로토 타입 객체에 대한보고됩니다 b에 설정되지 않은 모든 속성입니다.

당신은 편리한 기능이을 마무리 할 수 ​​있습니다

var follow = function(source) { 
    var Follower = function(){}; 
    Follower.prototype = source; 
    return new Follower(); 
} 

var a = {}; 
var b = follow(a); 

a.foo = 123; 
b.bar = 456; 

a.foo; // 123 
b.foo; // 123 

a.bar; // undefined 
b.bar; // 456 
+1

하지만'b'에'foo'를 설정하면'b.foo'를 물어 보면'a'가 아닌'b'의 버전을 얻을 수 있습니다. (당신도'b '를 만드는 것을 잊었습니다.) –

+0

"one way"가 맞습니까? –

+0

그것은 *** ***이 질문을 읽는 방법이 아니지만 그것이 OP가 원하는 것이 아니라는 것을 의미하지는 않습니다 ... –