【发布时间】:2014-05-03 17:27:20
【问题描述】:
我怎样才能创建这样的对象。
该对象应该有一个名称,一旦名称被设置,它就不能被修改。
var movies = {
genre:"Horror";
}
movies.genre= "Pop" I dont want to change my genre value
【问题讨论】:
标签: javascript private javascript-objects
我怎样才能创建这样的对象。
该对象应该有一个名称,一旦名称被设置,它就不能被修改。
var movies = {
genre:"Horror";
}
movies.genre= "Pop" I dont want to change my genre value
【问题讨论】:
标签: javascript private javascript-objects
您实际上可以更改对象的属性。
经过一番研究,我发现了这个,根据您的需要进行修改。
var data = { };
Object.defineProperty(data, 'secret', {
value: 42,
writable : false,
enumerable : true,
configurable : false
});
来自@jAndy的回答:
这样,我们在 data 中创建了一个值为
42的属性密钥,它不能被修改或删除。这里需要注意的是,天才(就像您所说的那样)也能够发现此代码并对其进行修改,以便再次能够根据需要更改内容。您只是无法以这种方式创建安全的前端 JavaScript。代码将始终以纯文本形式提供给所有人。
来源:How to prevent the changing of a variable value in Javascript
【讨论】:
您可以尝试使用带有描述符选项和可写属性的Object.defineProperty:
var o = {}; // Creates a new object
Object.defineProperty(o, "a", { value : 37,
writable : false });
console.log(o.a); // logs 37
o.a = 25; // No error thrown (it would throw in strict mode, even if the value had been the same)
console.log(o.a); // logs 37. The assignment didn't work.
【讨论】:
以下方法应该适用于所有浏览器,包括旧浏览器。
您可以使用闭包和立即调用函数 (IIFE) 来实现私有属性。下面是一个示例代码。这里初始值作为参数传递给 IIFE。 IIFE 使用 init 值初始化私有属性,然后返回一个包含私有属性访问器函数的对象。由于返回的对象没有直接拥有私有属性,因此无法修改,但可以通过闭包访问。
var objWithPrivateProp = (function(initValue){
var privateProp = initValue;
return {
getPrivateProp: function () {
return privateProp;
}
};
})("Horror");
【讨论】: