是否可以使JavaScript對象屬性爲只讀?我想設置一個不能修改的屬性...只讀屬性
Q
只讀屬性
4
A
回答
7
這是可能的,但昂貴。您可以通過具有真正的私有成員變量,然後提供存取功能做到這一點:
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"
0
我同意了答案,並想指出一些JavaScript框架,如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"
});
相關問題
- 1. 只讀屬性
- 2. Threadsafe只讀屬性
- 3. OData只讀屬性
- 4. ScriptControlDescriptor.AddProperty&只讀屬性
- 5. 只讀VS自動(只讀)屬性
- 6. 只讀自定義屬性
- 7. BLToolkit:公共只讀屬性
- 8. Automapper忽略只讀屬性
- 9. 上一個只讀屬性
- 10. Object.defineProperty覆蓋只讀屬性
- 11. 只讀屬性,在C#6.0
- 12. VB.net自動屬性 - 只讀?
- 13. 只讀屬性在MVC 4
- 14. 屬性:「分配」與「只讀」
- 15. 使用weak只讀屬性?
- 16. jQuery TokenInput - 只讀屬性
- 17. 刪除只讀屬性
- 18. 複選框只讀屬性
- 19. 只讀屬性類擴展
- 20. 只讀表單屬性
- 21. AS3:屬性爲只讀
- 22. PHP中的只讀屬性?
- 23. 只讀屬性或函數?
- 24. 重寫抽象只讀屬性以讀取/寫入屬性
- 25. 文本框只讀propperty通過只讀屬性
- 26. 劍道角度只讀屬性
- 27. 使只讀屬性可設置
- 28. Getter方法vs只讀屬性
- 29. VBS刪除只讀屬性recursivelty
- 30. UIView的屬性層是不是隻讀?
雖然,注意accessorFunction可以通過確定的用戶覆蓋。雖然它不會影響真正的私人變量,但它會影響任何調用accessorFunction的東西。 – cobbal 2009-08-24 11:01:50