zoukankan      html  css  js  c++  java
  • Javascript设置对象属性为"只读"

    有时为了保护某些属性,让其无法被更改,我们会把他们设置为常量。

    在某些语言里面,也许会用const来实现这样的功能。本文讲述如何在Javascript中实现这样的功能。

    方法一:

    var myObject = {
        get readOnlyProperty() { return 1024; }
    };
    
    alert(myObject.readOnlyProperty); // 1024
    myObject.readOnlyProperty = 5;    // 可以设置,但不管用
    alert(myObject.readOnlyProperty); // 1024

    如果你已经定义好了一个Object,那么你可以这么做

    var myObject = {};
    myObject.__defineGetter__("readOnlyProperty", function() { return 1024; });

    上面的这两段代码兼容Firefox,Opera 9.5+, Safari 3+和Chrom,不过杯具的是,这些代码是不兼容IE的。

    方法二:

    对于支持ECMAScript 5的Javascript解释器,你可以使用Object.defineProperty方法来实现这样的功能。

    在松散模式,Javascript解释器会直接忽略掉属性的写入。在严格模式(strict mode)下,解释器会抛出一个错误。

    var obj = {};
    Object.defineProperty( obj, "<属性名>", {
      value: "<属性值>",
      writable: false,
      enumerable: true,
      configurable: true
    });

    不过很明显,这代码是无法在那些不支持ECMAScript 5的浏览器(当然包括IE)上执行的。

    方法三:

    使用模块模式去模拟出这样的功能,不废话,直接看代码

    var CONFIG = (function() {
         var private = {
             'MY_CONST': '1',
             'ANOTHER_CONST': '2'
         };
      
    return { get: function(name) { return private[name]; } //函数返回一个对象,有get方法,接收name参数,返回内部私有变量的值 }; })(); alert(CONFIG.get('MY_CONST')); // 1 CONFIG.MY_CONST = '2'; alert(CONFIG.get('MY_CONST')); // 1 CONFIG.private.MY_CONST = '2'; // 错误,没有private属性 alert(CONFIG.get('MY_CONST')); // 1

    这个方法兼容目前全部浏览器(包括IE),只是读属性的时候需要使用get。

    方法四:

    在大部分情况下,你并不需要完全控制变量不可写。在业内有个约定,就是使用全大写的字母来表示常量(只读变量)。这是最简单,最好的方法。

    var MY_CONSTANT = "some-value";

    这样写,来告诉自己,这个变量不可以改变!!!

    总结:

    我个人比较推荐最后一种做法。简单明了,约定 也是解决很多问题的最好方法。

    其次是方法三,模块模式是比较好的模式,而且这种方法兼容性良好,因为我想大部分人用Javascript都是需要在IE上运行的。

    第二种方法是标准方法,如果以后Javascript解释器都支持ECMAScript 5的话。

    本文参考:stackoverflow.com

  • 相关阅读:
    ArcGIS engine中Display类库 (局部刷新)
    ArcGIS 空间查询一例
    反射方法获取事件的委托链上的函数
    [转] 基于C#的波形显示控件的实现
    C# 对Excel操作时,单元格值的读取
    44.Node.js Express 框架--web框架
    43.安装npm及cnpm(Windows)
    42.cnpm不是内部命令的解决方案:配置环境变量
    41.Node.js使用cnpm
    40.Node.js Web 模块
  • 原文地址:https://www.cnblogs.com/season-huang/p/seasonhuang.html
Copyright © 2011-2022 走看看