资讯专栏INFORMATION COLUMN

js对象

seal_de / 2412人阅读

摘要:也是一个隐藏函数,会在设置属性值时调用当只对属性定义而没有定义时,此属性进行复制操作时将被忽略,赋值会失败但是不会报错检测属性对象可以看作是属性的集合,因此我们会经常检测集合中成员的所属关系,即判断某个属性是否存在于某个对象中。

对象属性描述符

可写(writable attribute),表明是否可以设置该属性的值

可枚举(enumerable attribute),表明是否可以通过for/in循环返回该值

可配置(configurable attribute),表明是否可以删除或修改该属性
在es5之前,通过代码给对象创建的所有属性都是可写的、可枚举的和可配置的。在es5中则可以对这些特性加以配置

writable

示例代码:

var one = {}
Object.defineProperty(one, "a", {
  value : 1,
  writable : false,
  configurable: true,
  enumerable: true
})
one.a = 2;
console.log(one.a) //1

如示例,当将对象的属性的writable特性定义为false时,对属性值的修改就会静默失败

configurable

只要属性是可配置的,就可以使用defineProperty()方法来修改属性:

var one = {}
Object.defineProperty(one, "a", {
  value : 1,
  writable : true,
  configurable: false,
  enumerable: true
})
console.log(one.a) //1
one.a = 2;
console.log(one.a) //2
delete one.a
console.log(one.a) //2
Object.defineProperty(one, "a", {
  value: 3,
  writable: true,
  configurable: true,
  enumerable: true
}) //TypeError

当属性的configurable特性设置为false时,此属性无法使用delete删除,操作会默认失败,因为此属性是不可配置的,同时无法再修改configurable特性,会产生一个TypeError,即configurable修改成false是单向操作

enumerable

此描述符控制的是属性是否会出现在对象的属性枚举中,比如说for..in循环。如果把enumerable设置成false,这个属性就不会出现在枚举中,虽然可以正常访问。

var one = {b:2}
Object.defineProperty(one, "a", {
  value : 1,
  writable : true,
  configurable: true,
  enumerable: false
})
for (var key in one) {
  console.log(key + "---" + one[key]) //b---2
}

如上例所示,one对象定义了一个不可枚举的属性a,那么在for..in循环遍历时就无法获取到a属性,当你不希望某些特殊属性出现在枚举中,那就把它设置成enumerable:false

Getter和Setter

在es5中可以使用getter和setter部分改写默认操作,但是只能应用在当个属性上,无法应用在整个对象上。getter是一个隐藏函数,会在获取属性值时调用。setter也是一个隐藏函数,会在设置属性值时调用

var one = {
  get a() {
    return this._a_;
  },
  set a(val) {
    this._a_ = val * 2
  }
}
one.a = 2
console.log(one.a) //4

Tips:当只对属性定义getter而没有定义setter时,此属性进行复制操作时将被忽略,赋值会失败但是不会报错

检测属性

js对象可以看作是属性的集合,因此我们会经常检测集合中成员的所属关系,即判断某个属性是否存在于某个对象中。可以通过in运算符、hasOwnProperty()和propertyIsEnumerable()方法来检测

in和hasOwnProperty

in运算符左侧是属性名,右侧是对象,如果对象的自由属性或继承属性中包含这个属性则返回true,对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。对于继承属性将返回false:

var one = {
  a:1
}
console.log("a" in one) //true
console.log("b" in one) //false
console.log("toString" in one) //true
console.log(one.hasOwnProperty("a")) //true
console.log(one.hasOwnProperty("b")) //false
console.log(one.hasOwnProperty("toString")) //false
propertyIsEnumerable

propertyIsEnumerable()会检查给定的属性是否直接存在于对象中并且满足enumerable:true:

var one = {}
Object.defineProperty(one, "a", {
  value : 1,
  enumerable: true
})
Object.defineProperty(one, "b", {
  value : 2,
  enumerable: false
})
console.log(one.propertyIsEnumerable("a")) //true
console.log(one.propertyIsEnumerable("b")) //false
console.log(Object.keys(one)) //["a"]
console.log(Object.getOwnPropertyNames(one)) //["a","b"]

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88655.html

相关文章

  • JS中数据类型、内置对象、包装类型对象、typeof关系

    摘要:平时在复习基础知识时,经常会遇到数据类型基础数据类型内置对象包装类型对象,检测数据类型时,用到的值,感觉都差不多,但是又有差异。值与数据类型关系对比下图,即可知值相较于基础数据类型少多 平时在复习JS基础知识时,经常会遇到JS数据类型、基础数据类型、内置对象、包装类型对象,检测数据类型时,用到的typeof值,感觉都差不多,但是又有差异。今天特地整理下,方便理解。 JS数据类型 基础数...

    OldPanda 评论0 收藏0
  • 精读《JS 引擎基础之 Shapes and Inline Caches》

    摘要:概述的解释器优化器代码可能在字节码或者优化后的机器码状态下执行,而生成字节码速度很快,而生成机器码就要慢一些了。比如有一个函数,从获取值引擎生成的字节码结构是这样的指令是获取参数指向的对象,并存储在,第二步则返回。 1 引言 本期精读的文章是:JS 引擎基础之 Shapes and Inline Caches 一起了解下 JS 引擎是如何运作的吧! JS 的运作机制可以分为 AST 分...

    Tecode 评论0 收藏0
  • jQuery Deferred对象

    摘要:给普通的操作指定回调函数对象的最大优点,就是它把这一套回调函数接口,从操作扩展到了所有操作。方法用于指定对象状态为已失败时的回调函数。执行完毕执行成功执行失败接收一个或多个对象作为参数,为其指定回调函数。 什么是deferred对象 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型...

    baoxl 评论0 收藏0
  • [译]执行上下文、作用域链和JS内部机制

    摘要:执行上下文作用域链和内部机制一执行上下文执行上下文是代码的执行环境,它包括的值变量对象和函数。创建作用域链一旦可变对象创建完,引擎就开始初始化作用域链。 执行上下文、作用域链和JS内部机制(Execution context, Scope chain and JavaScript internals) 一、执行上下文 执行上下文(Execution context EC)是js代码的执...

    caozhijian 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<