一、如何编写可以计算的对象的属性名

我们都知道对象的属性访问分两种,键访问(["属性名"])和属性访问(.属性名,遵循标识符的命名规范)

对于动态属性名可以这样

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中的对象(八)的更多相关文章

  1. javascript中的对象,原型,原型链和面向对象

    一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...

  2. Javascript 中判断对象为空

    发现了一个巧妙的实现: 需要检查一个对象(Object)是否为空,即不包含任何元素.Javascript 中的对象就是一个字典,其中包含了一系列的键值对(Key Value Pair).检查一个对象是 ...

  3. JavaScript 中的对象

    JavaScript 中的对象 在 JavaScript 中,对象是数据(变量),拥有属性和方法. JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等.   访问对象的属性 访 ...

  4. javascript中Date对象的应用——简易日历的实现

    × 目录 [1]效果 [2]HTML [3]CSS[4]JS 前面的话 简易日历作为javascript中Date对象的常见应用,用途较广泛.本文将详细说明简易日历的实现思路 效果演示 HTML说明 ...

  5. JavaScript中判断对象类型方法大全1

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  6. (转)javascript中的对象查找

    本文转自:http://otakustay.com/object-lookup-in-javascript/  ---很棒的一篇文章,作者的其他文章还暂时没读,但相信作者是一个谦虚 谨慎的好工程师 近 ...

  7. Javascript中的对象和原型(3)

    在Javascript中的对象和原型(二)中我们提到,用构造函数创建的对象里面,每个对象之间都是独立的,这样就会降低系统资源的利用率,解决这样问题,我们就要用到下面提到的原型对象. 一 原型对象 原型 ...

  8. (转)javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  9. JavaScript中判断对象类型的种种方法

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  10. JavaScript中String对象的match()、replace() 配合正则表达式使用

    正则表达式由来已久,查找替换功能非常强大,但模板难记复杂. JavaScript中String对象的match().replace()这2个方法都要使用正则表达式的模板.当模板内容与字符串不相匹配时, ...

随机推荐

  1. javascript文档DOC

    python.java都有官网,有官方文档 javascript却找不到官网和官方文档 js大全 https://github.com/jobbole/awesome-javascript-cn md ...

  2. Bagging-Adaboost-RF的粗糙理解

    三种方法都是组合方法,组合方法是使用多个分类器进行投票[构造每个分类器的样本都是通过有放回抽样得到的] 1.Bagging(装袋):k次抽样,训练k次,得到k个模型(分类器),等权重投票 2.Adab ...

  3. Gym101482 NWERC 2014(队内训练第4场)

    -----------------------前面的两场感觉质量不高,就没写题解----------------------------- A .Around the Track pro:给定内多边形 ...

  4. LeetCode – All Nodes Distance K in Binary Tree

    We are given a binary tree (with root node root), a target node, and an integer value K. Return a li ...

  5. CH5701 开车旅行

    题意 5701 开车旅行 0x50「动态规划」例题 描述 小A和小B决定利用假期外出旅行,他们将想去的城市从1到N编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 ...

  6. 【添加最新版本的mysql的jdbc连接jar包】java.math.BigInteger cannot be cast to java.lang.Long异常

    [问题描述] 从我的电脑把项目拷贝到guo小中的win8电脑,but出现了那个错误,估计他的mysql是最新版本的. [如何下载连接jar包] 链接:https://pan.baidu.com/s/1 ...

  7. Queue接口的实现类竟然有一个是LinkedList,一个是优先队列(同一个接口,只改了不同的实现类,附源码)

    输出是: Queue接口底层换一个实现类,照样的是调用Queue接口中的方法 import java.util.HashMap; import java.util.LinkedList; import ...

  8. Map的嵌套使用

    Map嵌套Map: 例: AAA: Javas班: 001 熊大 002 熊二 Hdoop班 001 小猪猪 002 小菲菲 ★使用增强for循环遍历Set数组: import java.util.H ...

  9. 使用 pkg 打包分发 nodejs 应用

    pkg 是一个很不错的跨平台 nodejs 应用打包工具,使用此工具,我们只需要给与用户提供一个简单的 可执行文件就可以了,同时代码也是二进制的,提高了代码的安全性 备注:测试demo 很简单,也比较 ...

  10. 06机器学习实战之SVM

    对偶的概念 https://blog.csdn.net/qq_34531825/article/details/52872819?locationNum=7&fps=1 拉格朗日乘子法.KKT ...