【问题标题】:JavaScript object private argumentJavaScript 对象私有参数
【发布时间】: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


    【解决方案1】:

    您实际上可以更改对象的属性。

    经过一番研究,我发现了这个,根据您的需要进行修改。

    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

    【讨论】:

    • 请记住,此技术仅适用于 ECMAScript 5 浏览器。如果你需要支持 IE8,它就行不通了。 See this list.
    【解决方案2】:

    您可以尝试使用带有描述符选项和可写属性的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.
    

    【讨论】:

      【解决方案3】:

      以下方法应该适用于所有浏览器,包括旧浏览器。

      您可以使用闭包和立即调用函数 (IIFE) 来实现私有属性。下面是一个示例代码。这里初始值作为参数传递给 IIFE。 IIFE 使用 init 值初始化私有属性,然后返回一个包含私有属性访问器函数的对象。由于返回的对象没有直接拥有私有属性,因此无法修改,但可以通过闭包访问。

      var objWithPrivateProp = (function(initValue){
         var privateProp = initValue;
         return {
            getPrivateProp: function () {
                return privateProp;
            }
         };
      })("Horror");
      

      【讨论】:

        猜你喜欢
        • 2019-04-26
        • 2013-10-12
        • 2014-12-12
        • 1970-01-01
        • 2011-06-18
        • 2010-12-30
        • 1970-01-01
        • 2018-03-18
        • 2011-04-25
        相关资源
        最近更新 更多