Object方法
概述
object类是所有类的父类、也就是说所有对象都默认继承Object类,那么对应的Object
Object的方法主要分为原型方法和静态方法、相关属性对应的实例拥有的属性
相关属性
-
__proto__表示对象的原型指定当前构造函数的原型prototype -
constructor 表示对象的构造函数
原型方法
hasOwnProperty(判断本身是否具备这个属性)
let obj = {
age:18
}
// 原型添加属性
Object.prototype.name='aaa'
console.log(obj.name);// 原型属性
console.log(obj.age);// 本身的属性
console.log(obj.hasOwnProperty('name'));// false
console.log(obj.hasOwnProperty('age'));// true
isPrototypeOf 判断是否处于原型链上
class Person{
constructor(){
this.name='tom'
}
}
class Child extends Person{
constructor(){
super()
this.age=18
}
}
let child=new Child()
// console.log(Child.hasOwnProperty('name'));// true
let person=new Person()
console.log(child.isPrototypeOf(person));// false child是否存在于person的原型链上
console.log(person.isPrototypeOf(child));// false person是否存在于child的原型链上
// 判断是否处于原型链上
console.log(child.isPrototypeOf(Person));// false
console.log(Person.isPrototypeOf(child));// false
// 对应的Person 的原型是否存在于child的原型链上
console.log(Person.prototype.isPrototypeOf(child));// true
// 将对应的child的原型进行赋值
child.__proto__=person
// isPrototypeOf 传入的是对应查找原型链的对象
console.log(person.isPrototypeOf(child));// person对象是否存在于child的原型上
propertyIsEnumeable 判断属性是否可以遍历
class Animal{
constructor(){
this.name='dog'
this.run=()=>{}
}
eat(){
}
}
let animal=new Animal
animal.sex='男'
for(var key in animal){
console.log(key);// name run
}
// 检索是否可以枚举(for in 只能遍历可以枚举的属性)
console.log(animal.propertyIsEnumerable('run'));// true
console.log(animal.propertyIsEnumerable('eat'));// false
console.log(animal.propertyIsEnumerable('sex'));// true
toString 将对象转为字符串 toLocalString 将对象转为本地格式字符串
静态方法
Object.assign 将传入的对象的内容填入第一个传入的对象内容内 返回的是第一个对象
// 里面可以传入任意对象 将对应的后面的参数的内容填入到第一个对象中 返回第一个对象
let object = Object.assign({name:'aaa'},{age:18},{sex:'男'})
console.log(object)// {name:'aaa',age:18,sex:'男'}
let copyObj = Object.assign({},first)// 浅拷贝
// 浅拷贝 拷贝第一层的值 深层拷贝地址 产生新的对象
Object.create 创建一个对象
// 根据传入的内容来创建对应的内容
let first = {
name:'jack'
}
let newObj = Object.create(first)// 根据传入的first来创建新的对象
// create他是将对应的传入的对象放入创建对象的原型上
简单实现
function create(obj){
let newObj={}
newObj.__proto__ = obj
return newObj
}
Object.keys 返回对象的所有的key 不包含不可枚举的属性 也不包含原型上的属性
Object.values 返回对象的值
Object.entries 返回对象的所有键值对
返回值都是数组
Object.is判断两个对象是否一致
let first={}
let last = {}
Object.is(first,last)
Object.getPrototypeOf 获取原型
Object.setPrototypeOf 设置原型
function Person(){}
let person=new Person
console.log(Object.getPrototypeOf(person));
let obj={name:'bbb'}
Object.setPrototypeOf(obj,person)// 将person作为obj的原型
console.log(person.isPrototypeOf(obj));// true
对象相关操作限制的方法
密封 只能查询和修改 其他操作不允许 seal isSealed
冻结 只能查询 freeze isFrozen
不可扩展 不能进行内容的添加 preventExtensions isExtensible
冻结 必定密封和不可扩展 密封 必定不可扩展
// 查询都能做 不然的话对应的对象创建就没有意义了
let obj={name:'jack'}
console.log(Object.isExtensible(obj));// false
// 不可扩展 返回当前对象
Object.preventExtensions(obj)
// 检测是否可扩展
console.log(Object.isExtensible(obj));// true
obj.age=18 // 未加进去
obj.name='tom' // 可以修改
delete obj.name // 可以删除
console.log(obj);{}
let obj = { name: 'jack' }
// 密封 必定导致不可扩展
Object.seal(obj)
console.log(Object.isExtensible(obj));// false
// 判断是否密封
console.log(Object.isSealed(obj));// true
obj.age = 18 // 不可添加
obj.name = 'tom' // 可以修改
delete obj.name // 不可以删除
console.log(obj)// { name: 'tom' }
let obj = { name: 'jack' }
Object.freeze(obj)
// 判断是否可扩展
console.log(Object.isExtensible(obj));// false
// 判断是否密封
console.log(Object.isSealed(obj));// true
// 判断是否冻结
console.log(Object.isFrozen(obj)); // true
obj.age = 18 // 不可添加
obj.name = 'tom' // 不可以修改
delete obj.name // 不可以删除
console.log(obj);// { name: 'jack' }
属性相关的获取方法
Object.getOwnPropertyNames(获取对象上的多有属性名 (不包含symbol修饰的 不包含原型上的))
Object.getOwnPropertySymbols(获取对象上名字为symbol的属性名 不包含原型上的)
Object.getOwnPropertyDescriptors(获取所有的属性的详细对象(不包含原型上的))
Object.getOwnPropertyDescriptor(获取对应的属性的详细对象 (不包含原型上的))
function Person(){
this.name='name'
}
Person.prototype.age=18
Person.prototype[Symbol('你好')]='你好'
let person = new Person()
person[Symbol('你好')]='hello'
person.sex='男'
// 获取所有的属性名 传入对象 返回的是对应的数组
// getOwnPropertyNames 不会获取原型的属性 不会获取symbol为key的属性
let names = Object.getOwnPropertyNames(person)
console.log(names);// name sex 没有原型上的属性
// 获取所有的symbol修饰的属性
let symbols=Object.getOwnPropertySymbols(person)
console.log(symbols);
// 获取属性的详情对象
// 获取某个属性的详情对象 传入对应的对象及属性
let descriptor=Object.getOwnPropertyDescriptor(person,'name')
console.log(descriptor);
// 获取所有属性的详情对象 包含原型上的属性 不包含symbol修饰的属性
let descriptors=Object.getOwnPropertyDescriptors(person)
console.log(descriptors);
Object.defineProperty用于定义对象的属性(vue2的底层实现)
属性属性
访问器属性
configurable 是否可以删除
enumerable 是否可以枚举
get getter 访问时调用
set setter 设置的时候调用
let obj={}
// 传入对象 传入属性 传入属性对象
Object.defineProperty(obj,'name',{
configurable:false,
enumerable:false,
value:'tom',
writable:false
})
console.log(obj)// {name:'tom'}
obj.name='aaa' // 无效configable为false
for(var key in obj){
console.log(key)// 无效 enumerable 为false
}
delete obj.name // 无效 writable 为false
console.log(obj)
数据驱动原理
let obj = {}
// 传入对象 传入属性 传入属性对象
Object.defineProperty(obj, 'name', {
// 对应的属性 默认值均为false
configurable: false,// 是否可以删除
enumerable: false,// 是否可以枚举
value: 'tom',
writable: false// 是否可以修改
})
console.log(obj)// {name:'tom'}
obj.name = 'aaa' // 无效configable为false
for (var key in obj) {
console.log(key)// 无效 enumerable 为false
}
delete obj.name // 无效 writable 为false
console.log(obj)
let _obj = {} // 借助一个新的对象来进行操作
Object.defineProperty(obj,'age',{
configurable:true,
enumerable:true,
get(){
// return obj.age 会造成栈溢出
console.log(111);
return _obj
},
set(value){
_obj.age=value
console.log(222);
}
})
obj.age = 18// 访问set
console.log(obj);// 访问
Object.defineProperties用于定义对象的多个属性
let obj={}
let _obj={}
// 传入对象 及对应的属性详情对象
Object.definePropertys(obj,{
name:{
configurable: true,// 是否可以删除
enumerable: true,// 是否可以枚举
value: 'tom',
writable: true// 是否可以修改
},
age:{
configurable: true,// 是否可以删除
enumerable: true,// 是否可以枚举
get(){
return 18
},
set(value){
_obj.age = value
}
}
})
面试题
查看属性的相关方法
for in 只能遍历可枚举的属性 (可以遍历原型上的 不可以遍历symbol) Object.keys 只能遍历本身的 (不可以遍历原型上的 也不可以遍历不可枚举的 symbol)
浙公网安备 33010602011771号