2017-11-22 12 views
0

에 대한 세터 나는 전통적인 자바 스크립트의 간단한 객체와 생성자가 있습니다.자바 스크립트를 다음과 같이 내부 객체

내부 객체 (data)의 속성을 설정하는 value에 대한 Setter를 작성하고 싶습니다.

test.value.whatever=23; 

내가 할 수있는 방법이 있습니까?

은 내가 세터 기능은 다음과 같이 뭔가 일을 끝낼 수 있다는 기대 : 여기

set value() { 
     // how do I get property & value? 
     data[property]=value; 
    }, 
+0

은'test.value' 객체가'.value' 세터를 호출하지 않는의 속성을 설정 , 아니. – Bergi

+0

왜 이것을하고 싶습니까? '.whatever' setter로'.value'와 object를 만들 수도 있고 프록시를 사용하여 모든 접근을 캐치 할 수도 있지만 실제 문제에 대한 간단한 해결책이 될 것입니다 (https://meta.stackexchange.com)./q/66377). – Bergi

+0

@Bergi 'NodeList'와 비슷한 여러 요소를 포함하는 간단한 배열과 유사한 객체를 개발 중입니다. 이 개체에 대해 단일 요소에서 유사한 형식을 사용하여 일부 작업을 수행하고 싶습니다. 'elements.innerHTML'을 쉽게 구현할 수 있지만'elements.style'에는 중첩이 필요합니다. 'elements.style (property [, value])'를 사용할 수 있다는 것을 알고 있지만, 단일 요소 작업을 미러링하는 것을 선호합니다. 대체 솔루션이 있지만 Getters & Setters 사용에 대해 자세히 알고 싶습니다. – Manngo

답변

0

당신은

function Test() { 
    this.data = {}; 
} 
Test.prototype={ 
    set value(v) { 
     this.data.whatever = v; 
    }, 
    get value() { 
     return this.data.whatever; 
    } 
}; 
var test = new Test(); 
test.value = 'hi'; 
console.log(test.value) // 'hi' 
console.log(test.data) // {whatever: 'hi'} 

는 생성자에서 data 속성을 넣어 기억 이동합니다. 그렇지 않으면 프로토 타입에 넣으면 모든 인스턴스간에 공유 속성이됩니다.

+0

좋은 지적. 나는 그 질문을 수정했다.감사합니다 – Manngo

+0

@Manngo 내 솔루션을 귀하의 질문을 해결하지 않았나요? – damianmr

+0

아니요, 객체 안의 _arbitrary_ 속성을 설정하는 방법을 알고 싶었습니다. 이것이'data' 객체입니다. – Manngo

0

좋아, 대답이 있습니다 : @Bergi & @ damianmr에서 제안한대로 Proxy 개체를 사용했습니다.

function Test() { 
    this.dataStore={}; 
    this.data=new Proxy(this,{ 
     set(target,property,value) { 
      target.dataStore[property]=value; 
     }, 
     get(target,property) { 
      return target.dataStore[property]; 
     } 
    }); 
} 
Test.prototype={ 

}; 

var test=new Test(); 
test.data.whatever=23; 
test.data.etc=46; 

alert(`${test.data.whatever} ${test.data.etc}`); 

당신이 볼 수 있듯이 : 여기

는 작업 버전입니다

  • I 객체가 dataStore라고했고, 프록시는 data
  • 프록시는 생성자에서 설정됩니다라고

이것은 간단한 추상화 된 경우입니다. 하지만 더 복잡한 프로젝트에서 작동합니다.

유일한 단점은 IE가 Proxy를 지원하지 않는다는 것과 내가 본 polyfills가 새로운 속성을 좋아하지 않는다는 것입니다. 단지 그들이 죽을 때까지 내가 레거시 브라우저의 기능적인 대안을 제공하고, 기다릴 필요가 의미

...

+0

물론,이 간단한 예제에서 프록시는 'this.data = this.dataStore'도하지 않았을 아무것도하지 않습니다 :-) – Bergi