个人学习记录之深入理解Object、原型、原型链

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: 对象的详细介绍

  1. constructor 构造函数
  2. isPrototypeOf 用于检查一个对象是否存在于另一个对象的原型链中
  3. propertyIsEnumerable 查询对象中给定的属性是否可枚举(就是能不能被for in 循环)
  4. valueOf
  5. toString 方法返回一个表示对象的字符串 跟自身语言环境无关
  6. toLocaleString 方法返回一个表示对象的字符串 跟自身语言环境有关
  7. 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有很多内建函数如下: 各函数详细描述传送

此文章这里只介绍我用过的、熟悉的、知道是什么的

  1. assign 将一个或者多个源对象中所有可枚举的自有属性复制到目标对象,并返回修改后的目标对象。可以用它实现浅拷贝,对象复制等
  2. create 以传入的对象作为原型,创建一个新对象。
  3. defineProperties 用于批量设置属性标识符和getter、setter
  4. defineProperty 用于设置属性标识符和getter、setter
  5. entries 将对象转为数组 一个数组是两个长度,0:key,1:value
  6. freeze
  7. fromEntries
  8. getOwnPropertyDescriptor 获取可枚举的属性的属性描述符
  9. getOwnPropertyDescriptors 获取所有可枚举的属性的属性描述符
  10. getOwnPropertyNames 获取对象的key包括不可枚举的key,但是不包括symbol
  11. getOwnPropertySymbols 仅获取对象包括symbol的key
  12. getPrototypeOf 获取对象的原型
  13. hasOwn 传入对象和一个key判断key是不是对象自身的属性(不包括原型)
  14. is
  15. isExtensible
  16. isFrozen
  17. isSealed
  18. keys
  19. preventExtensions
  20. seal
  21. setPrototypeOf 可以把一个指定对象的原型设置为另一个对象
  22. 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()
    }
})

在这里插入图片描述

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值