目录
2)构造函数模式:使用Object或者使用自定义构造函数来初始化对象(例如Student)
检测属性(检测一个属性是否属于某个对象,返回true或false)
3)obj.propertyIsEnumerable('属性名')
1)JSON.stringify(obj):对象序列化即将对象转换为JSON字符串
2)JSON.parse(json):反序列化即将字符串还原为对象
①Object.defineProperty(obj, '属性名', {具体配置})
②Object.defineProperties(obj,{一个或多个属性的具体配置})
①Object.getOwnPropertyDescriptor(obj,'属性名')
②Object.getOwnPropertyDescriptors(obj)
访问器属性不能直接定义,它包含的是一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的
对象的概念
无序属性的集合,其属性可以包含基本值,对象,或者函数。
可以将对象想象成散列表:键值对,其中值可以是数据或者函数。
ECMAScript中的对象其实就是一组数据(属性)和功能(方法)的集合。
万物皆对象,对象也是一个变量,但对象可以包含多个值(多个变量),每个值以key:value键值对的方式呈现。
对象的创建
1)对象字面量
对象使用"{ }"作为对象的边界,对象是由多个属性组成,属性与属性之间通过","隔开,属性名与属性值通过":"隔开
2)构造函数模式:使用Object或者使用自定义构造函数来初始化对象(例如Student)
对象的访问
1)属性访问(点访问法、中括号访问)
点后面直接跟的是对象的属性,如果属性存在可以访问到,如果属性不存在得到undefined。
中括号中放的是变量,中括号可以将该变量进行解析(变量要用单或双引号引起来)
2)方法的访问
//以下执行结果不一样
obj.sayName; //
obj.sayName(); //方法的调用
遍历对象中的属性
普通版的for循环可以遍历数组,但无法遍历对象
for..in用于遍历数组或者对象的属性
删除对象中的属性(只能删除对象的自有属性)
自有属性:指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性
继承属性:继承来的属性
delete obj.属性名
delete obj['属性名']
检测属性(检测一个属性是否属于某个对象,返回true或false)
1)'属性名' in obj
自有属性或者继承属性返回true,否则返回false
'自有属性名' in obj //true
'toString' in obj //true(继承属性)
'自有属性名' in obj //false
2)obj.hasOwnProperty('属性名')
自有属性返回 true,否则返回false
obj.hasOwnProperty('自有属性名') //true
obj.hasOwnProperty('toString') //false(继承属性)
obj.hasOwnProperty('非自有属性名') //false
3)obj.propertyIsEnumerable('属性名')
是hasOwnProperty()的增强版,检测除了是自身属性外,还必须是可枚举属性,即我们创建的属性
obj.propertyIsEnumerable('自有可枚举属性名') //true
面试题:什么是原型?
每一个构造函数都有一个原型对象(Object.prototype),
每一个原型对象都有一个指针指向构造函数(Object.prototype.constructor)
实例都包含一个指向原型对象的指针(obj.__proto__)
引用数据类型Object,所有其他引用类型都是Object的子类型,如 Array function
静态方法和静态属性
只能由构造函数(Object)本身去调用的方法和属性
1)静态方法
Object.defineProperty();
Object.defineProperties();
Object.getOwnPropertyDescriptor();
Object.getOwnPropertyDescriptors();
Object.assign();
2)静态属性
Object.prototype
原型对象的属性和方法
实例可以继承原型对象中的方法和属性
1)原型对象中的方法
toString();
hasOwnProperty();
propertyisEnumerable();
2)原型对象中的属性
toString;
对象序列化
1)JSON.stringify(obj):对象序列化即将对象转换为JSON字符串
JSON字符串的属性名和属性值都加双引号
2)JSON.parse(json):反序列化即将字符串还原为对象
3)对象+序列化+反序列化 != 原来对象
定义属性
ECMAScript中有两种属性:数据属性、访问器属性。
这两种属性用于设置属性的高级属性,例如该属性是否可以配置,是否可以读写,是否可以遍历,并且可以通过setter,getter来监听数据的改变。
1)数据属性
①Object.defineProperty(obj, '属性名', {具体配置})
定义或者修改一个属性
注意:当我们创建一个对象并且为对象设置一个属性的时候,该属性特性Configurable、Enumerable、Writable默认都为true,value为该属性的值。
Object.defineProperty(目标对象,'定义修改属性名',{
configurable:'是否可删除',true-可删除 flase-不可删除
writable:'是否可修改',true-可修改 false-表示不可修改
enumerable:'是否可枚举', true-可枚举 false-不可枚举(用for..in循环来检验)
value:'给属性设置属性值' 默认数据属性全部为true
})
②Object.defineProperties(obj,{一个或多个属性的具体配置})
定义或者修改一个或多个属性
参数说明:
1. obj:必需。目标对象
2. props:该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置
2)读取属性
①Object.getOwnPropertyDescriptor(obj,'属性名')
该方法返回指定对象上一个自有属性对应的属性描述符
②Object.getOwnPropertyDescriptors(obj)
所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。
3)访问器属性
访问器属性不能直接定义,它包含的是一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的
访问器属性包含的四个特性:
configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为false
enumerable:表示能否通过for-in循环返回属性,默认为false
get:在读取属性时调用的函数,默认值为undefined
set:在写入属性时调用的函数,默认值为undefined
这里要注意下,访问器属性不能直接定义,要通过Object.defineProperty()这个方法来定义