对象属性特性

数据(数据描述符)属性

[[Configurable]]

表示能否通过delete删除此属性,能否修改属性的特性,或能否修改把属性修改为访问器属性,如果直接使用字面量定义对象,默认值为true

[[Enumerable]]

表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性,如果直接使用字面量定义对象,默认值为true

[[Writable]]

能否修改属性的值,如果直接使用字面量定义对象,默认值为true

[[Value]]

该属性对应的值,默认为undefined

访问器(存取描述符)属性

[[Configurable]]

和数据属性的[[Configurable]]一样,表示能否通过delete删除此属性,能否修改属性的特性,或能否修改把属性修改为访问器属性,如果直接使用字面量定义对象,默认值为true

[[Enumerable]]

和数据属性的[[Configurable]]一样,表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性,如果直接使用字面量定义对象,默认值为true

[[Get]]

一个给属性提供 getter 的方法(访问对象属性时调用的函数,返回值就是当前属性的值),如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined

[[Set]]

一个给属性提供 setter 的方法(给对象属性设置值时调用的函数),如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined
var my = {
name:’lixiaohua’,
age:32,
_year:2019
}

  1. Object.defineProperty(my, 'year', {
  2. set: function (newvalue) {
  3. this.age += newvalue - this._year;<br /> this._year = newvalue;<br /> }<br /> })

创建/修改/获取属性特性的方法

1 Object.defineProperty()

功能:
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。如果不指定configurable, writable, enumerable ,则这些属性默认值为false,如果不指定value, get, set,则这些属性默认值为undefined
语法: Object.defineProperty(obj, prop, descriptor)
obj: 需要被操作的目标对象
prop: 目标对象需要定义或修改的属性的名称
descriptor: 将被定义或修改的属性的描述符
var obj = new Object();

Object.defineProperty(obj, ‘name’, {
configurable: false,
writable: true,
enumerable: true,
value: ‘张三’
})

console.log(obj.name) //张三

Object.defineProperties()

功能:
方法直接在一个对象上定义一个或多个新的属性或修改现有属性,并返回该对象。
语法: Object.defineProperties(obj, props)
obj: 将要被添加属性或修改属性的对象
props: 该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置
var obj = new Object();
Object.defineProperties(obj, {
name: {
value: ‘张三’,
configurable: false,
writable: true,
enumerable: true
},
age: {
value: 18,
configurable: true
}
})

console.log(obj.name, obj.age) // 张三, 18

Object.getOwnPropertyDescriptor()

功能:
该方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
语法: Object.getOwnPropertyDescriptor(obj, prop)
obj: 需要查找的目标对象
prop: 目标对象内属性名称
var person = {
name: ‘张三’,
age: 18
}

var desc = Object.getOwnPropertyDescriptor(person, ‘name’);
console.log(desc) 结果如下
// {
// configurable: true,
// enumerable: true,
// writable: true,
// value: “张三”
// }

Object. getOwnPropertyDescriptors()

功能:
所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。
语法: Object.getOwnPropertyDescriptors(obj)
obj: 需要查找的目标对象
var person = {
name: ‘张三’,
age: 18
}
var desc = Object.getOwnPropertyDescriptors(person);
console.log(desc)
//{
// configurable: true,
// enumerable: true,
// value: ‘张三’,
// writable: true
//}
MDN对象:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object

理解原型对象

对象_理解对象 - 图1

2 对象是否在原型链上

isPrototypeOf()

描述:
isPrototypeOf() 方法允许你检查一个对象是否存在于另一个对象的原型链上
参考地址:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf
对象_理解对象 - 图2

对象_理解对象 - 图3
object的原型链是针对AFunction.prototype进行检查的,而不是针对AFunction本身。这句话非常重要,请牢记。
对象_理解对象 - 图4
instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置
语法:
prototypeObj.isPrototypeOf(object)
对象_理解对象 - 图5
对象_理解对象 - 图6

getPrototypeOf

ES5增加了一个新方法,叫Object. getPrototypeOf(),可以方便地取得一个对象的原型,而这在利用原型实现继承的情况下是非常重要的。支持这个方法的浏览器有IE9+、Firefox3.5+、Safari5+、Opera 12+ 和 Chrome。
参考地址:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/GetPrototypeOf
Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。
语法:
Object.getPrototypeOf(object)
对象_理解对象 - 图7
对象_理解对象 - 图8
对象_理解对象 - 图9

对象_理解对象 - 图10

hasOwnProperty()

对象_理解对象 - 图11
参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
hasOwnProperty()方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性
语法
obj.hasOwnProperty(prop)
对象_理解对象 - 图12
对象_理解对象 - 图13

原型与in操作符

对象_理解对象 - 图14
对象_理解对象 - 图15
对象_理解对象 - 图16

3 实例对象和原型中的属性不可枚举的实现方法

对象_理解对象 - 图17

Object.keys()

参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for…in 循环遍历该对象时返回的顺序一致 。
对象_理解对象 - 图18
对象_理解对象 - 图19
对象_理解对象 - 图20

Object.getOwnPropertyNames()

参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames
Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性;不包括原型链上继承的属性)组成的数组。
对象_理解对象 - 图21
对象_理解对象 - 图22
对象_理解对象 - 图23