2009-08-24 9 views
4

자바 스크립트 개체 속성을 읽기 전용으로 설정할 수 있습니까? 수정할 수없는 속성을 설정하고 싶습니다 ...읽기 전용 속성

답변

7

가능하지만 비쌉니다. 당신은 진정으로 개인 멤버 변수를 가진 후 접근 기능을 제공하여 작업을 수행 할 수 있습니다

접근 기능이 VAR를 통해 폐쇄이기 때문에 작동
var NiftyThing = function() { 
    var trulyPrivateVariable; 

    trulyPrivateVariable = 5; // For instance 
    this.accessorFunction = function() { 
     return trulyPrivateVariable; 
    } 
}; 

. 비용은 각 인스턴스에 접근 자 함수의 자체 복사본이 있음을 의미합니다.

편집 : 사용법 :

var n = new NiftyThing(); 
alert(n.trulyPrivateVariable); 
// Alerts "undefined" 
alert(n.accessorFunction()); 
// Alerts "5" 

이 이상 Private Member Variables in JavaScript를 참조하십시오.

+3

, 비록 정해진 사용자에 의해 덮어 쓸 수 accessorFunction을 확인합니다. truelyPrivateVariable에는 영향을주지 않지만 accessorFunction을 호출하는 모든 항목에 영향을줍니다. – cobbal

0

나는 대답에 동의하고주의하는 것이 싶습니다 bob.js 지원 등의 기본 메커니즘 같은 일부 자바 스크립트 프레임 워크 :

var obj = { }; 
//declare read-only property. 
bob.prop.namedProp(obj, 'name', 'Bob', true); 
//declare read-write property. 
bob.prop.namedProp(obj, 'age', 1); 

//get values of properties. 
console.log(bob.string.formatString('{0} is {1} years old.', obj.get_name(), obj.get_age())); 
//set value of read-write property. 
obj.set_age(2); 
console.log(bob.string.formatString('Now {0} is {1} years old.', obj.get_name(), obj.get_age())); 

//cannot set read-only property of obj. Next line would throw an error. 
// obj.set_name('Rob'); 

//Output: 
//======== 
// Bob is 1 years old. 
// Now Bob is 2 years old. 

그러나, 당신은 특정 get 접근과 재산에 대한 특별한 요구 사항이있는 경우 구현 요구 사항을 파악한 다음 필요에 따라 값을 가져 오는 함수를 더 잘 정의하십시오.

- 텡 기즈

0

당신은 Object.defineProperty (사용하고, 이런 식으로 뭔가를 구현할 수 있습니다) :

function blockProperties(object, properties) { 
    "use strict"; 
    // If not properties passed, then use the already defined ones: 
    if (typeof properties === "undefined") { 
     properties = object; 
    } 
    // Loop trough the properties 
    for (var property in properties) { 
     if (properties.hasOwnProperty(property)) { 
      // Make property read-only 
      Object.defineProperty(object, property, { 
       value: properties[property], 
       writable: false, 
       configurable: false, 
       enumerable: false 
      }); 
     } 
    } 
    return object; 
} 

var someObject = {}; 

blockProperties(someObject, { 
    propertie1: "someValue", 
    propertie2: "someOtherValue" 
}); 

someObject.propertie1 = "this doesn't change anything"; 

console.log(someObject.propertie1); // Output: "someValue" 

// Because "window" is also an object, you can set an only-read global var: 
blockProperties(window, { 
    onlyReadVariable: "onlyReadValue" 
});