Javascript中的对象(八)
一、如何编写可以计算的对象的属性名
我们都知道对象的属性访问分两种,键访问(["属性名"])和属性访问(.属性名,遵循标识符的命名规范)
对于动态属性名可以这样
var prefix = "foo"
var obj = {
[prefix +"name"] : "youyi",
[prefix +"age"]: "22"
}
(这里可以对比学习一下es6中的symbol)
二、如何给对象的属性添加特性
通过Object.defineProperty()定义对象的属性
1、writable为false,不可给对象属性a赋值
var obj = {}
Object.defineProperty(obj, "a", {
value: 2,
writable: false,
configurable: true,
enumerable: true
})
console.log(obj.a)//2
obj.a = 3
console.log(obj.a)//2
2、configurable为false,属性不能再定义第二次,定义之后会报错;也不能删除属性。
属性不能再定义第二次,定义之后会报错
var obj = {}
Object.defineProperty(obj, "a", {
value: 2,
writable: false,
configurable: false,
enumerable: true
})
obj.a = 3
Object.defineProperty(obj, "a", {
value: 2,
writable: false,
configurable: true,
enumerable: true
})
不能删除属性
var obj = {
}
obj.a = 3
console.log("normal:", obj.a)
delete obj.a
console.log("normal:",obj.a)
Object.defineProperty(obj, "a", {
value: 2,
writable: false,
configurable: false,
enumerable: true
})
console.log(obj.a)
delete obj.a
console.log(obj.a)
输出:
normal: 3
normal: undefined
2
2
3、enumerable为false,属性不会出现在枚举中
什么是可枚举?
对象属性能出现在对象的遍历中就是可枚举。
如何判断属性是否可以枚举?
obj.propertyIsEnumerable("属性名")
如何获取所有可枚举属性?
Object.key(obj)(注意:和getOwnPropertyNames()不同,后者会获取到对象中的所有属性,两者共同点是只查找对象直接包含的属性,不查找原型链上的)
四、创建不可变性的对象
1、writable和configurable都设置为false
2、Object.preventExtensions禁止对象的扩展,不能再添加新的属性
var obj = {}
obj.a = 2
Object.preventExtensions(obj)
obj.b = 3
obj.b//undefined
3、Object.seal()密封对象,调用Object.preventExtensions,并且将所有属性configurable设置为false。(不可添加新属性,也不能重新配置或
删除现有任何属性)
4、Object.freeze()冻结对象,在Obect.seal()的基础上,将所有数据访问属性writable设置为false。(啥都干不了了)
五、对象中的[[Get]]、[[Put]]、Getter和Setter
当给一个对象设置属性时,会触发[[Put]];
当读取一个对象中的属性时,会触发[[Set]]
创建访问属性符(当给属性定义getter、setter或两者都有时):
var obj = {
get a() {
return 2
}
}
Object.defineProperty(obj, "b", {
get: function() {
return this.a*2
},
enumerable: true
})
//obj.a //2
//obj.b //4
属性定义get方法时,赋值操作会无效
var obj = {
get a() {
return 2
}
}
obj.a = 3
obj.a //2
六、判断对象属性是否存在
判断对象中是否存在某个属性的两种方式:in和hasOwnProperty,
两者的区别是in会遍历到对象的原型链上,hasOwnProperty只会在对象中查找,不会查找至原型链。
需要注意的是,对于用Object.create(null)创建的空对象和{}不同,前者创建的空对象没有prototype属性
var t = Object.create(null);
t.hasOwnProperty("a")
//Uncaught TypeError: t.hasOwnProperty is not a function var t = {};
t.hasOwnProperty("a")
//false
Javascript中的对象(八)的更多相关文章
- javascript中的对象,原型,原型链和面向对象
一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...
- Javascript 中判断对象为空
发现了一个巧妙的实现: 需要检查一个对象(Object)是否为空,即不包含任何元素.Javascript 中的对象就是一个字典,其中包含了一系列的键值对(Key Value Pair).检查一个对象是 ...
- JavaScript 中的对象
JavaScript 中的对象 在 JavaScript 中,对象是数据(变量),拥有属性和方法. JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等. 访问对象的属性 访 ...
- javascript中Date对象的应用——简易日历的实现
× 目录 [1]效果 [2]HTML [3]CSS[4]JS 前面的话 简易日历作为javascript中Date对象的常见应用,用途较广泛.本文将详细说明简易日历的实现思路 效果演示 HTML说明 ...
- JavaScript中判断对象类型方法大全1
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- (转)javascript中的对象查找
本文转自:http://otakustay.com/object-lookup-in-javascript/ ---很棒的一篇文章,作者的其他文章还暂时没读,但相信作者是一个谦虚 谨慎的好工程师 近 ...
- Javascript中的对象和原型(3)
在Javascript中的对象和原型(二)中我们提到,用构造函数创建的对象里面,每个对象之间都是独立的,这样就会降低系统资源的利用率,解决这样问题,我们就要用到下面提到的原型对象. 一 原型对象 原型 ...
- (转)javascript中event对象详解
原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解 博客分类: javaScript JavaScriptCS ...
- JavaScript中判断对象类型的种种方法
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- JavaScript中String对象的match()、replace() 配合正则表达式使用
正则表达式由来已久,查找替换功能非常强大,但模板难记复杂. JavaScript中String对象的match().replace()这2个方法都要使用正则表达式的模板.当模板内容与字符串不相匹配时, ...
随机推荐
- SQLI DUMB SERIES-1
less-1 (1) 可以看到提示输入ID,而且less-1题目也有提到GET,因此试试以下操作: http: 结果: http: 结果: 现在可知,“ ' ”并没有被过滤,因此可以进行以下操作: h ...
- python 闭包和迭代器
一 函数名的运用:(函数名是一个变量,但它是一个特殊变量,与括号配合可以执行变量. (1) 函数名可以赋值给其他变量 def chi(): print("吃月饼") fn=chi ...
- 更换JDK版本时的问题:Error: could not open `C:\Java\jre7\lib\amd64\jvm.cfg'
1.先把oracle自带的weblogic给卸载了,然后打开eclipse,发现报错了:Error: could not open `C:\Java\jre7\lib\amd64\jvm.cfg' J ...
- PDO数据库引擎
PDO概述1.PDO是一种数据库访问抽象层,你不必使用以前的 mysqli_xx 之类只能访问 mysql数据库.使用PDO可以连接mysql.msssql.oracle等等,而不必重写代码.2.PD ...
- ISCC的 Web——WP
比赛已经结束了,自己做出来的题也不是很多,跟大家分享一下 第一题:比较数字大小 打开连接 在里面随意输入一个值,他会提示数字太小了 那么我们输入他允许的最大值试试 他还是提示太小了 我们知道做web‘ ...
- GraphQL Gateway Architectures
转自: https://tomasalabes.me/blog/graphql/node/microservices/2018/08/11/graphql-architectures.html Gra ...
- 嵌入式LINUX设置时间
date -s "2018-12-15 08:55:00" 安装NTP从网络获取时间 基于Linux的嵌入式开发,需要用到本地的时间,但是网上找了很多修改时间的命令,但大多是Lin ...
- zookeeper 图形化的客户端工具:ZooInspector
查看Zookeeper中的数据,我们可以通过ZkCli.sh命令客户端查看,但是不太直观,因为Zookeeper本身数据是以树型结构存储组织的, 今天推荐一个实用的界面操作工具ZooInspector ...
- 洛谷 5291 [十二省联考2019]希望(52分)——思路+树形DP
题目:https://www.luogu.org/problemnew/show/P5291 考场上写了 16 分的.不过只得了 4 分. 对于一个救援范围,其中合法的点集也是一个连通块. 2n 枚举 ...
- 代码问题: 【MatConvNet库编译】
问题1: 老版本的MatConvNet在编译对cuDNN支持的时候,cuDNN的版本是2或者4比较好,官网有明确的描述. 比如我编译用了cuDNN 6.0的版本,在编译 nnconv_cudnn.cu ...