使用将数字隐藏在只读 getter 后面的构造函数:
var MyObject = function(version) {
var _version = version;
this.getVersion = function() { return _version; }
}
或者,使用允许变量仅设置一次的 getter 和 setter 对:
var MyObject = function() {
var self = this;
var _tripwire = false;
var _value = null;
self.setValue = function(val) {
if (_tripwire==false)
_tripwire = true;
else
throw "Value is read-only";
_value = val;
};
self.getValue = function() {
return val;
}
};
JSFiddle
根据您希望它如何失败,您可以将 throw 语句替换为静默吃掉属性集的 return,但是对于 API 代码,当调用者做了一些非常不安全的事情时,最好大声而自豪地死去。
请注意,如果您更喜欢属性样式的访问方法,您也可以使用属性访问器完成相同的设计模式:
function setOnceProp(o, name) {
var _value = null;
var _tripwire = false;
Object.defineProperty(o, name, {
get: function() {
return _value;
},
set: function(newValue) {
if (_tripwire==false)
_tripwire = true;
else
throw "Value is read-only";
_value = newValue;
},
enumerable: true
});
}
var MyObject = function() {
var self = this;
setOnceProp(self, 'value');
};
这确实要求您的客户使用相对较新的浏览器。