Javascript设置对象属性为"只读"
有时为了保护某些属性,让其无法被更改,我们会把他们设置为常量。
在某些语言里面,也许会用const来实现这样的功能。本文讲述如何在Javascript中实现这样的功能。
方法一:
var myObject = {
get readOnlyProperty() { return 1024; }
};
alert(myObject.readOnlyProperty); //
myObject.readOnlyProperty = ; // 可以设置,但不管用
alert(myObject.readOnlyProperty); //
如果你已经定义好了一个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')); //
CONFIG.MY_CONST = '2';
alert(CONFIG.get('MY_CONST')); //
CONFIG.private.MY_CONST = '2'; // 错误,没有private属性
alert(CONFIG.get('MY_CONST')); //
这个方法兼容目前全部浏览器(包括IE),只是读属性的时候需要使用get。
方法四:
在大部分情况下,你并不需要完全控制变量不可写。在业内有个约定,就是使用全大写的字母来表示常量(只读变量)。这是最简单,最好的方法。
var MY_CONSTANT = "some-value";
这样写,来告诉自己,这个变量不可以改变!!!
总结:
我个人比较推荐最后一种做法。简单明了,约定 也是解决很多问题的最好方法。
其次是方法三,模块模式是比较好的模式,而且这种方法兼容性良好,因为我想大部分人用Javascript都是需要在IE上运行的。
第二种方法是标准方法,如果以后Javascript解释器都支持ECMAScript 5的话。
本文参考:stackoverflow.com
Javascript设置对象属性为"只读"的更多相关文章
- Python面向对象基础:设置对象属性
用类存储数据 类实际上就是一个数据结构,对于python而言,它是一个类似于字典的结构.当根据类创建了对象之后,这个对象就有了一个数据结构,包含一些赋值了的属性.在这一点上,它和其它语言的struct ...
- JavaScript 访问对象属性和方法及区别
这篇文章主要介绍了浅析JavaScript访问对象属性和方法及区别的相关资料,仅供参考 属性是一个变量,用来表示一个对象的特征,如颜色.大小.重量等:方法是一个函数,用来表示对象的操作,如奔跑.呼吸. ...
- C#通过属性名字符串获取、设置对象属性值
之前理工项目从这个博客找到了相对应的方法:C#通过属性名字符串获取.设置对象属性值 https://www.cnblogs.com/willingtolove/p/12198871.html
- JavaScript 操作对象属性(设置属性, setter/getter, 序列化)
参考自<<JavaScript权威指南 第6版>>, 文字太多反而不易理清其中的关系, 直接上代码和注释 /* * 对象的setter和getter属性: * 定义为一个或者两 ...
- javascript window对象属性和方法
window对象 window对象表示一个浏览器窗口或一个框架.在客户端JavaScript中,window对象是全局对象,所有的表达式 都在当前的环境中计算.也就是说,要引用当前窗口根本不需要特殊的 ...
- JavaScript原生对象属性和方法详解——Array对象
http://www.feeldesignstudio.com/2013/09/native-javascript-object-properties-and-methods-array/ lengt ...
- javascript中对象属性的介绍
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaScript 之 对象属性的特性 和defineProperty方法
对象是无序属性的集合,而这些属性在创建是都带有一些特征值(可以理解为属性的属性,天生自带的),这些特征值是为了实现JavaScript引擎用的,因此JavaScript不能直接访问. JavaScri ...
- JavaScript Window对象属性
window 代表浏览器中一个打开的窗口. Window的属性 属性 描述 closed 获取引用窗口是否已关闭. defaultStatus 设置或获取要在窗口底部的状态栏上显示的缺省信息. dia ...
随机推荐
- mysql 慢查询的小结
MySQL优化的第一步应该做的就是排查问题,找出瓶颈,而通常情况下的瓶颈和问题都需要通过观察MySQL的运行情况来进行分析,而对于大多数的程序员来说,最容易发现并解决的问题就是MySQL的慢查询或者没 ...
- myeclipse一直卡在loading workbench解决方法
删除工作空间下.metadata中的org.eclipse.ui.workbench org.eclipse.ui.workbench.texteditor
- Arduino uno 引脚说明
http://openhome.cc/Gossip/Books/mBlockArduino1-3and1-4.html http://swf.com.tw/?p=406
- mysql 连接池超时
var mysql = require('mysql'); var pool = mysql.createPool({ host: 'localhost', user: 'nodejs', passw ...
- 在wex5平台grid显示问题
新建的时候必须自动生成一个主表id,然后grid里面的column里面的editable必须是true,input里面的bind-ref得绑定值.
- 微信测试服务器验证sha1加密法,工具类
1 package org.fc.Util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExcep ...
- 转:WaitForSingleObject()函数、WaitForMultipleObject()函数
http://blog.csdn.net/xiaobai1593/article/details/6672193 在多线程下面,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以 ...
- ehcache注解全面解析---打酱油的日子
通过ehcache以编程方式使用缓存: 跟上面的方式相同,但是缓存通过ehcache去管理,当然比使用map有N多种好处,比如缓存太大了快达到上限之后,将哪一部分缓存清除出去.这种方式完全是通过代码的 ...
- 【CQgame】[幸运方块 v1.1.2] [Lucky_Block v1.1.2]
搬家首发!!! 其实从初一我就写过一些小型战斗的游戏,但是画面都太粗糙,代码也比较乱,也就是和两三个同学瞎玩,但自从观摩了PoPoQQQ大神的游戏,顿时产生了重新写一部游戏的冲动,于是各种上网查找各种 ...
- HTC辟谣: HTC Vive2不会在CES 2017上公布
HTC官方:第二代Vive不会在CES 2017上发布.曾有消息称HTC Vive的下一代--Vive 2将在CES 2017上展出能成为首个4K头显以及无线头显.但日前HTC官方给于否认,此消息不实 ...