2014-04-17 4 views
0

나는 이것이 불가능하다는 것을 확신하지만 어쩌면 누군가가이 일을 할 기회가 있는지 알고있다. myPerson.setName이있는 경우JavaScript에서 과제에 함수 호출하기

1 myPerson = new Person(); 
2 myPerson.name = 'Charles Xavier'; 

라인 # 2의 코드가 자동으로 확인 어디서 경우가 있으므로 직접 할당을하는 대신에

myPerson.setName('Charles Xavier'); 

를 호출 곳이 가능한 코드를 가지고있다.

+1

수표 기능을 만드는 헬퍼 기능을 만드시겠습니까? 또는'setName()'내부에서 체크하지 않는 이유는 무엇입니까? – stackErr

답변

2

아니요, 죄송합니다. ES6에서도 가능합니다.

var o = {}; 
Object.defineProperty(o, "name", { 
    set: function (value) { 
    console.log("Property 'name' set to: " + value); 
    // store 'value' somewhere 
    } 
}); 

c.f. 관련 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

이 이후 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

이 < ES6에 가능하지 않다가, AngularJS와 같은 프레임 워크 속성 변경에 대한보고 (일명 그들은 초당 값 X 시간을 확인) 더러운 검사를 사용합니다.

+0

더티 검사가 끔찍한 소리를냅니다! 이 유형의 기능이 ES6과 함께 제공된다는 것은 매우 멋지다. –

+1

@Kirk 하하 끔찍한 소리지만 AngularJS에서는 꽤 잘 작동합니다. – Aegis

1

모든 브라우저가 아니지만, javascript proxy은 파이어 폭스에서만 작동하며 이것이 쓸모 없게 만듭니다. : D

var Validator = { 
    set: function(obj, prop, value){ 
     if(prop == 'name' && setName in obj) 
      obj.setName(value); 

     obj[prop] = value; 
    } 
} 

var myPerson = new Proxy(Person, Validator); 
myPerson.name = 'Charles Xavier'; // This will call Validator.set