数据类型-object对象数据类型

数据类型-object对象数据类型,第1张

特点:由多组键值对组成,由多组[属性名和属性值]组成

属性名和属性值是用来描述这个对象特征的比如:var obj={name:’张三’,age:18}

创建对象有2种方式:

1、字面量创建方式  var obj={}

2、实例创建方式    var obj=new Object()

1>给对象添加属性名和属性值  obj.name=’张三’  或者 obj[“name”]=’张三’

2>修改对象的属性名和属性值  obj[“name”]=’李四’

3>获取属性名和属性值  console.log(obj[“name”]) 或者 console.log(obj.name) 如果属性民不存在默认返回undefined

4>删除属性名和属性值  obj.name=null//假删除    delete obj.name//真删除

对象数据类型中的object对象数据类型,还可以细分:对象类(Object)、数组类(Array)、正则类(RegExp)、时间类(Date)、Math数学函数等等对应的实例对象、数组、正则、时间等等

Js对象、类、实例的区别:对象是泛指,js中万物皆对象,类是对象的组成部分,实例是类中的一个具体的事物

该属性返回对象类型原型的使用。

参数说明:

objectName:是对象的名称。

用prototype属性可以提供对象的类的一组基本功能。对象的新实例“继承”赋予该对象原型的 *** 作。

例如,要为Array对象添加返回数组中最大元素值的方法是,声明该函数,将它加入Array.prototype,并使用它。

//结果:7,y保存数组x中的最大值

该属性表示创建对象的函数

参数说明:

object:必选项。是对象或函数的名称。

constructor属性是所有具有prototype的对象的成员。它们包括除Global和Math对象以外的所有js固有对象。constructor属性保存了对构造特定对象实例的函数的引用。例如:

//结果: true

JavaScript属性分为可枚举属性和不可枚举属性?什么是“枚举”,它又有什么用呢?

我们知道, for...in 语句以任意顺序遍历一个对象的 可枚举属性 。

既 stu.age 可枚举,stu.name 不可枚举,而他们是否可枚举是通过 enumerable 来设置的。

我们通常会直接创建对象,然后设置对象的属性,例如上面的 obj 对象,设置了 name ,price 属性。其实这些属性也有一定的限定的,这些限定属性性质的我们称为“属性描述符”。

这里拿 price 属性来说,我们能输出 fruit.price 等于 18 ,其实是通过 price 的描述符 value 来设置的。例如上面的stu.age 的设置;

price 也有“enumerable”描述符,他之所以能被 for in 到 ,是因为对自身添加属性的 “enumerable” 默认为 true。

除了上面说到过的 “value” 和 “enumerable” 还有什么描述符呢?

每个属性都有

Configurable描述符、Enumerable描述符、Writable描述符、Value描述符

或者,每个属性都有

Configurable描述符、Enumerable描述符、Get描述符、Set描述符

前者称为 数据描述符 ,他们的值决定了该js对象的属性的某些性质及是否可读写。

后者称为 读取描述符 ,他们的值决定了该js对象的属性的某些性质及读写的行为。

描述符必须是这两种形式之一,不能同时是两者。

那么这些属性是各代表着什么?

数据描述符具有以下键值

读取描述符具有以下键值

知道这些描述符所控制的性质,那又是什么时候去哪里设置的呢?这就关乎到Object.defineProperty() 了,它有三个参数,Object.defineProperty(obj, prop, descriptor),其中descriptor就是设置属性性质描述符。

知道了Object.defineProperty()这个东东是用来生成或修改一个对象属性,知道对象属性的性质是靠descriptor这个参数来设置之后,我们来看看他是怎么运用的。

以 var person = {} 为例,我们要怎样去修改默认的属性值呢?

现在我们来修改下enumerable和writable值

我们试试吧configurable的值改为false

我们来模拟一个访问和设置的默认行为

什么,溢出了?这是为什么?

哦~原来是这么写的话会造成循环引用,狂call不止

我们看下流程:

person.a → get.call(person) → this.a → person.a → get.call(person) → this.a......

我们来修改下

这就是数据描述符和读取描述符的应用方式。在平时简单的开发中可能用不上,但是知道了这些之后对一些框架的封装的理解还是很有帮助的,例如vue数据双向绑定原理上利用的就是Object.defineProperty方法。

每个对象都有的一些方法:

Object.getOwnPropertyDescriptor 的应用:

一般直接添加属性时,属性描述符默认值都为 true,当用 Object.defineProperty() 方法来添加对象属性时,此时的属性描述符默认值为false

以文章开头的 apple 和 stu 的案例:

Object.create() 的第二个参数为 Object.defineProperties 的第二个参数,既设置属性及属性描述符, 详情移步到 Object.create()

参考资料:

1. MDN

3. 关于 Object.defineProperty() 小结


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11349172.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存