Object是什么?
Object在JavaScript中是一种用于存储复杂数据的引用类型(非原始类型)。
属性描述符
对象属性(properties),除 value 外,还有三个特殊的特性(attributes),也就是所谓的“标志”:
- writable — 如果为 true,则值可以被修改,否则它是只可读的。
- enumerable — 如果为 true,则会被在循环中列出,否则不会被列出。
- configurable — 如果为 true,则此属性可以被删除,这些特性也可以被修改,否则不可以。
Object.getOwnPropertyDescriptor 方法允许查询有关属性的完整信息。
const user = {name:'age',age:'78',brid:'1888/04/05'}
Object.getOwnPropertyDescriptor(user, 'age')
使用 Object.defineProperty() 添加的属性是不可写、不可枚举和不可配置的。除非显式设置了
可以使用 Object.defineProperty修改标志。
Object.defineProperty(user,'age',{
value:'550',
writable: false,
})
并且defineProperty可以重写属性get() set()
Object.defineProperty(user, 'age', {
get() {
return `${this.name} ${this.surname}`;
},
set(value) {
[this.name, this.surname] = value.split(" ");
}
});
原型是什么?
原型最开始(指在原型链中,不是指时间)是对象(Object)的一个属性。当有新对象继承了一个对象时,新对象的原型就是被继承的对象。所有的引用类型都继承了Object,所以对象能用的方法数组也可以使用。
原型链是什么?
原型链是一个对象继承于另外一个对象,这时另外一个对象的属性会作为对象的[[prototype]]存在,当这种现象多次出现就形成了原型链。
例: 有A,B,C三个对象 ,A继承B,B继承C ,此时A可以访问B和C中的拥有的属性和函数。B和C就是A的原型链
Object的原型属性(prototype)具有以下函数:ps: 对象的详细介绍
- constructor 构造函数
- isPrototypeOf 用于检查一个对象是否存在于另一个对象的原型链中
- propertyIsEnumerable 查询对象中给定的属性是否可枚举(就是能不能被for in 循环)
- valueOf
- toString 方法返回一个表示对象的字符串 跟自身语言环境无关
- toLocaleString 方法返回一个表示对象的字符串 跟自身语言环境有关
- hasOwnProperty 查询对象中是否存在给定的属性
tips:注意此处的prototype为Object.prototype, 此处的prototype是Object的一个属性。
感觉上 约等于user.name或者user.age
Object.prototype.constructor 对象在原型上的构造函数
PS : Object.prototype.constructor和Object.constructor不一样
PS : Object.prototype.constructor和Object.constructor不一样
PS : Object.prototype.constructor和Object.constructor不一样
Object.constructor 是将输入转换为一个对象。它的行为取决于输入的类型
Object.prototype.constructor
Object.prototype.constructor 详解传送门
有趣的是它是一个函数然后返回了很多的内建函数,然后它还没有被保护。
也就是说可以通过Object.prototype.constructor = 123465来给它赋值。
instanceof判断引用类型
需要注意的是instanceof是依据prototype来进行判断是否相等的。
Object.prototype.constructor有很多内建函数如下: 各函数详细描述传送
此文章这里只介绍我用过的、熟悉的、知道是什么的
- assign 将一个或者多个源对象中所有可枚举的自有属性复制到目标对象,并返回修改后的目标对象。可以用它实现浅拷贝,对象复制等
- create 以传入的对象作为原型,创建一个新对象。
- defineProperties 用于批量设置属性标识符和getter、setter
- defineProperty 用于设置属性标识符和getter、setter
- entries 将对象转为数组 一个数组是两个长度,0:key,1:value
- freeze
- fromEntries
- getOwnPropertyDescriptor 获取可枚举的属性的属性描述符
- getOwnPropertyDescriptors 获取所有可枚举的属性的属性描述符
- getOwnPropertyNames 获取对象的key包括不可枚举的key,但是不包括symbol
- getOwnPropertySymbols 仅获取对象包括symbol的key
- getPrototypeOf 获取对象的原型
- hasOwn 传入对象和一个key判断key是不是对象自身的属性(不包括原型)
- is
- isExtensible
- isFrozen
- isSealed
- keys
- preventExtensions
- seal
- setPrototypeOf 可以把一个指定对象的原型设置为另一个对象
- values
以上函数结合起来使用就会有神奇的事情发生:比如实现一个浅拷贝
const user = {name:'age',age:'78',brid:'1888/04/05'}
const people = Object.create(
Object.getPrototypeOf(user),
Object.getOwnPropertyDescriptors(user)
)
// people {name: 'age', age: '78', brid: '1888/04/05'}
再比如在上面的对象中存储age是不合适的因为年龄会随着时间而变化,此时就可以使用defineProperty或者definePropertys手动设置age的getter属性,就解决了age不会随时间变化的问题
const user = {name:'age',age:'78',brid:'1888/04/05'}
Object.defineProperty(user,'age', {
get(){
return new Date().getFullYear() - new Date(this.brid).getFullYear()
}
})