2011-04-21 2 views
0

javascript 개체의 메서드에서 다시 쓰기를 사용하지 않도록 설정할 수있는 방법이 있습니까? 나는 이것이 내가 몇 년 전 방법을 다시 작성하고 싶었 원인, 수행 할 수 있습니다, 그리고 만 얻을 수있다 그 방법에 대한 자바 스크립트 콘솔에서 오류가 발생하지 생각javascript : 개체 메서드 다시 쓰기 사용 안 함

var myObj=new Object(); 
myObj.doSomething=function(){ 
alert("good message") 
} 

myObj.doSomething=function(){ 
alert("bad message") 
} 

myObj.doSomething(); // I want to alert me with "good message" 

: 예를 들어

세트. 당신이 객체를 설정할 수 있습니다 인 ECMAScript 5에서

감사

답변

3

unmodifiable 할 수 :

Object.freeze(myObj); 

사용 수정할 수 없습니다 개별 속성 만들 수 있습니다

Object.createProperty(myObj, 'name', descriptor); 

descriptorobject containing flags이며 그 중 하나는 configurable입니다. false으로 설정하면 해당 프로를 방지 할 수 있습니다. 퍼티가 변경되거나 삭제되는 것을 방지합니다.

+0

당신은 또한 Object.seal을 사용할 수 있습니다. – Raynos

+0

당신이 맞을 때 ECMAScript-262 3 판 및 그 다양한 구현에서 야생의 엄청나게 많은 브라우저가 여전히 실행 중임을 명심해야합니다 (그러나 슬프게도). 당신이 이식성을 찾고 있다면, 동결과 봉인의 존재는 의지 할 수 없습니다. –

+0

@ 마이크 예, 절대적으로. 나는 첫 줄에서이를 한정했다 ;-). 내가 아는 한 이전 버전에는 표준 솔루션이 없습니다. – Alnitak

0

JavaScript는 의 모든 내용이으로 변경 될 수 있다는 개념으로 설계되었습니다. 의 기능을 무시할 수 있습니다., ,, , 시간입니다.

이것은 축복이자 저주 다.

오류 메시지가 나타나면 (a) JavaScript/JScript 구현의 버그이거나 (b) 생각했던 것과 다를 수 있습니다.

AMMENDED : ECMAScript 5 코드를 보았을 가능성이 있습니다. 나는 오랫동안 ECMAScript 3를 유지해 왔는데 나는 그 가능성에 눈 멀게하는 백내장을 분명히 개발했습니다. 용서 해줘. 나는 겸손하게 교정했다.

+0

예. ECMAScript 5라고 생각합니다. 스크립트를 실행하기 위해 최신 버전의 Mozilla Rhino가 필요했기 때문입니다. 그 때 나는 그 오류에 대해별로주지 않았다. 감사합니다. –

0

Alnitak이 질문에 대한 좋은 직접적인 답변을 가지고 있지만, 성취하고자하는 것에 따라 클로저를 통해 메소드를 '비공개'변수로 만들어 '다시 쓰기'를 막을 수 있습니다. '공개'기능을 보호하지는 않지만 사적인 기능을 숨기고 수정을 방지 할 수 있습니다. 물론

var myObj = (function(){ 
    var data = {count: 0}; 
    var privateFunction1 = function(){ 
     data.count++; 
    }; 

    var privateFunction2 = function(){ 
     // do something else 
    }; 

    var result = { 
     callPrivateFunction: function(){ 
      privateFunction(); 
      privateFunction2(); 
     } 
    }; 

    return result; 
})(); 

, 민간 기능을 다시 쓸 수있다, 그래서 당신은 단지 주변의 문제를 밀어 수 있습니다 성취하려는 내용에 따라 호출하는 공공 기능. 그러나이 방법은 캡슐화를 수행하고 원하는 API보다 개체의 API를 더 많이 사용하지 않는 좋은 방법입니다.

+0

.좋은 예입니다. 나는 처음으로 생각했다. 그러나 내가 성취하고자하는 일에 도움이되지 않는다. 네가 말했듯이, 사적인 것을 부른 공공 기능을 다시 쓸 수 있기 때문이다. –