js中的对象

创建对象的几种方式

对象属性的特征(特性)

对象属性的特性主要有两种,数据属性和访问器属性

数据属性

  • [[Configurable]]:默认为true,该属性是否可被delete后重新定义
  • [[Enumerable]]:默认为true,该属性是否可使用for-in遍历到
  • [[Wirtable]]:默认为true,该属性值是否可写
  • [[Value]]:属性值,默认为undefine

要修改数据属性,必须使用Object.defineProperty()方法,该方法有如下三个参数:

  • 属性所在的对象
  • 属性名
  • 描述符对象:该对象的属性必须是configurable、enumerable、wirtable或者value
let person = {} 
Object.defineProperty(person, 'name', {  
  writable: false,
  value: 'John'
}) 
console.log(person.name) // John
person.name = 'ZhangSan' 
console.log(person.name) // John 

注意,在使用Object.defineProperty将configurable改为false之后,就不能再将它改为true了

访问器属性

  • [[Configurable]]:默认为true,该属性是否可被delete后重新定义
  • [[Enumerable]]:默认为true,该属性是否可使用for-in遍历到
  • [[Get]]:默认为undefine,读取属性时调用的方法
  • [[Set]]:默认为undefine,设置属性值时调用的方法

访问器属性不能直接定义,要使用 `Object.defineProperty()来定义

let person = {
  name: 'John'
} 
Object.defineProperty(person, 'name', {
  get: function() {
    return this.name
  }
  set: function(newValue) {
  	this.name = newValue
  }
})

访问多个属性的特性值 Object.defineProperties

Object.defineProperty()的基础上,Object.defineProperties(),从名字可以看出来,通过这个方法,我们可以通过描述符一次定义多个属性

let person = {}
Object.defineProperties(person, {
  name: {
    value: 'John',
    wirtable: false
  },
  age: {
  	value: 20,
  	get() {
  		return this.value
  	}
  }
})

读取属性特征值 Object.getOwnPropertyDescriptor

Object.getOwnPropertyDescriptor()这个方法可以获取对象属性的特征值,有两个参数

  • 属性所在的对象
  • 属性名称
let person = {}
Object.defineProperties(person, {
 name: {
   value: 'John',
   writable: false
 },
 age: {
   value: 20,
   get: function() {
     console.log('年龄'+ this.age)
     return this.age
   }
 }
})

// 获取
let decription1 = Object.getOwnPropertyDescriptor(person, 'age');
console.log(decription1.value) // 20
console.log(typeof decription1.get) // function

let decription2 = Object.getOwnPropertyDescriptor(person, 'name');
console.log(decription2.value) // John
console.log(typeof decription2.get) // undefine

hasOwnProperty()与in

  • in,无论属性存在于实例对象本身还是其原型上,都返回true
  • hasOwnProperty(),只有当改属性存在于示例对象本身上时,才返回true
function Person() {}
Person.prototype.sayName = function() {}
let p = new Person();
p.name = 'John';

console.log(p.hasOwnProperty('sayName')) // false
console.log('sayName' in p) // true
console.log('name' in p) // true
console.log(p.hasOwnProperty('name')) // true
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值