一、Object原型方法
1.hasOwnProperty
语法:
对象.hasOwnProperty(非继承属性名) - 判断一个对象中是否有自带的某个属性
返回布尔值,true表示是,false表示否。
只有自己内非继承的属性才能返回true,继承的和不是自己的属性都是false。
2.isPrototypeOf
语法:
对象a.isPrototypeOf(对象b) - 判断对象a是否在对象b的原型链上
返回布尔值
3.in
语法:
属性 in 对象 - 属性是否在对象中
返回布尔值
如果属性在对象中本身没有,原型上有,in 也能返回true
4.propertyIsEnumerable
语法:
对象.propertyIsEnumerable(属性名) - 判断这个属性是否能遍历
返回布尔值 自己的属性可以遍历 继承来的属性无法遍历
5.toString
语法:
对象.toLocaleString() - 将非字符串类型转为字符串类型
{}定义的对象调用 toString 方法将对象转成 [object Object] 字符串
6.toLocaleString和valueOf
toLocaleString
和valueOf
没有实际的效果,是为了让子原型能具备这些方法,来实现不同类型数据的功能。
数字有toLoaleString方法 - 将数字进行 千分位分割
其他类型的数据调用后,会默认调用toString
方法转成字符串而已。
时间日期对象有valueOf方法 - 将事件日期对象转成时间戳
其他类型的对象调用,会得到具体的值,相当于console.log(数组/对象)
的值
二、Object方法
1.assign
语法:
var 新目标对象 = Object.assign(原目标对象, 被复制的对象) - 用于将一个对象中可遍历的属性复制到另一个目标对象中
返回值 就是 第一个参数 目标对象
2.create
语法:
var 对象 = Object.create(指定的原型对象, {对象键值对的描述}) - 用于创建一个对象,并指定这个对象的原型
创建对象的时候必须指定这个对象的原型 - object或null
var o = Object.create(null, { // 给对象指定属性和值的配置 // name: '张三' /* 语法: 属性名: { 对这个属性的值/特性做描述 } */ name: { // 指定属性的值 - 用vlaue属性 value: '张三', // 指定属性可遍历 - 用enumerable属性 enumerable: true, // 指定属性是否可写 - 用writable属性 writable: true, // 指定属性是否可删除 - 用configurable属性 configurable: true } })
3.defineProperties
语法:
Object.defineProperties(对象, {对象键值对的描述}) - 用于给对象添加或修改一个属性
Object.defineProperties(obj, { name: { enumerable: false, // 指定是否可遍历 writable: false // 指定属性是否可写 }, age: { configurable: false } })
4.entries
语法:
Object.entries(对象) - 用于将对象中可遍历的键值对组成一个数组并返回
返回的数组跟map数据格式一样
5.fromEntries
语法:
Object.fromEntries(map格式的数据)
返回键值对组成的对象
6.defineProperty
语法:
Object.defineProperty(对象, 属性名, {对象描述符}) - 监视对象某个属性被设置或被访问
数据双向绑定:当数据改变了,页面的结构也要跟这改变;如果页面中的内容改变了,数据也要跟着改变
监听对象的某个属性的值改变 - 数据劫持 Object.defineProperty(obj, 'name', { // 监听属性值变化 - set方法 set: function(val) { // 当属性的值被设置的时候会触发这个方法的执行 // console.log(666, val); // 参数val正在设置的值是多少 input.value = val }, // 监听属性值被访问 - get方法 get() { // 当属性值被访问的时候会触发执行 // console.log(666); // 访问到的结果是这个方法的返回值 // return 666 return input.value } })
7.freeze
语法:
var 对象 = Object.freeze(对象) - 用于冻结一个对象,让对象不能新增、不能修改、不能删除、不能改原型,不能改属性的特性
对象冻结后,原型不可以修改,但是可以给原型设置属性和方法
8.getOwnPropertyDescriptors
语法:
Object.getOwnPropertyDescriptors(对象) - 获取对象中某个属性对应的描述对象
返回对象的描述符
9.getOwnPropertySymbols
语法:
Object.getOwnPropertySymbols(对象) - 将对象中所有symbol属性,组成一个数组。
10.getPrototypeOf
语法:
Object.getPrototypeOf(对象) - 获取对象的原型对象
11.hasOwn
语法:
对象.hasOwnProperty() ==== Object.hasOwn(对象, 属性)
判断一个属性是否属于某个对象,而不是被继承来的。 跟hasOwnProperty的功能一样
12.is
语法:
Object.is(数据1, 数据2) - 用来判断两个数据是否相等
返回布尔值
基本数据类型 - 看表面上看起来是否相等
引用数据类型 - 判断地址是否相同
13.isExtensible
语法:
Object.isExtensible(对象) - 用于判断一个对象是否可扩展(是否可以给对象添加属性)
冻结对象、密封对象不可以扩展
14.isFrozen
语法:
Object.isFrozen(对象) - 判断对象是否被冻结
15.keys
Object.keys(对象) - 获取对象中所有键组成的数组
将所有键放在一个数组中返回
16.seal
Object.seal(要被封闭的对象) - 封闭一个对象,让对象不能添加新属性、不能删除键值对
可以设置
17.values
语法:
Object.values(对象) - 获取对象中所有值组成的数组
18.preventExtensions
语法:
Object.preventExtensions(对象) - 让一个对象不可扩展(不可添加)
19.setPrototypeOf
语法:
Object.setPrototype(对象, 原型) - 给对象设置原型
三、ES6的对象操作
1.Symbol
专业用来做对象的属性,让对象可以拥有多个同名属性
语法:
var obj = { name: '张三', age: 12 } // 想给对象添加name属性和age属性,可以对象中已经有了name属性和age属性了,此时就将name和age做成symbol数据,然后将symbol数据当做对象的键使用 // 通过name和age做成symbol数据 var nameSymbolKey = Symbol('name') var ageSymbolKey = Symbol('age') // 将symbol数据当做对象的键 obj[nameSymbolKey] = '李四' obj[ageSymbolKey] = 13 console.log(obj);
symbol数据不能跟其他数据进行运算,不能进行隐形类型转换
Symbol可以强制转换成字符串和布尔值
2.Reflect
解决对象访问、修改、删除后我们无法知道是否成功的问题
语法:
Reflect.get(对象, 键) // 返回值或undefined Reflect.set(对象, 键, 值) // 给对象添加键值对,返回布尔值 Reflect.deleteProperty(对象, 键) // 删除对象键值对,返回布尔值
3.Proxy
创建一个被劫持/监听的对象,当访问、设置、删除对象键值对的时候会被监视到,和defineProoerty的功能是一样的。
语法:
var pbj = new Proxy(obj, { // get方法是当访问pbj的属性的时候会执行的方法 get(o, k) { // console.log(111, o, k); // console.log(666); // 访问到的内容是get方法的return值 // return 222 return o[k] }, // set方法是当给pbj设置属性的时候会执行的方法 set(o, k, v) { console.log(999, o, k, v); o[k] = v } })
第一个参数是对象; 第二个参数是键名; 第三个参数是键值;