-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
重学js —— js数据类型:Object 基础介绍(内部方法和内置插槽等) #53
Comments
Open
lizhongzhen11
changed the title
重学js——Object 基础介绍(内部方法和内置插槽等)
js数据类型(四):Object 基础介绍(内部方法和内置插槽等)
Nov 9, 2019
lizhongzhen11
changed the title
js数据类型(四):Object 基础介绍(内部方法和内置插槽等)
重学js —— js数据类型(四):Object 基础介绍(内部方法和内置插槽等)
Nov 9, 2019
This was referenced Jan 7, 2020
Open
Open
This was referenced Feb 26, 2020
Open
lizhongzhen11
changed the title
重学js —— js数据类型(四):Object 基础介绍(内部方法和内置插槽等)
重学js —— js数据类型(五):Object 基础介绍(内部方法和内置插槽等)
Apr 6, 2020
lizhongzhen11
changed the title
重学js —— js数据类型(五):Object 基础介绍(内部方法和内置插槽等)
重学js —— js数据类型(六):Object 基础介绍(内部方法和内置插槽等)
Apr 12, 2020
This was referenced Apr 23, 2020
This was referenced May 8, 2020
This was referenced May 22, 2020
Open
lizhongzhen11
changed the title
重学js —— js数据类型(六):Object 基础介绍(内部方法和内置插槽等)
重学js —— js数据类型:Object 基础介绍(内部方法和内置插槽等)
Jun 4, 2020
This was referenced Jun 23, 2020
This was referenced Jul 1, 2020
This was referenced Jul 13, 2020
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Object 基础介绍
对象的字符串属性键名 整数索引 在 0 ~ 253 - 1间(源于string的长度限制)。
属性有两种访问方式:
get
和set
,分别对应取值和赋值。通过get
和set
可以访问对象自身属性和继承属性。JavaScript 中的对象分类
来源于规范中定义的对象以及winter《重学前端》——JavaScript对象:你知道全部的对象分类吗?。
{}
语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。)Array
属于固有对象,但是其生成的数组对象被winter划分到这里。属性描述符
数据属性的属性描述符见下表:
false
,通过ECMAScript代码试图使用[[Set]]
改变该属性[[Value]]
特性不会成功true
,该属性能被for-in
枚举(见13.7.5)。否则,该属性不可枚举。false
,尝试删除该属性,将该属性转换为访问器属性或者改变它的特性([[Value]]
以外的其他值,或将[[Writable]]
更改为false
)等操作都会失败。[[Value]]依然可以改。js代码示例:
访问器属性的属性描述符见下表:
[[Call]]
内置方法(见表),每次执行属性的get
访问时检索属性值。set
访问时会使用包含 赋值作为其唯一参数的 参数列表调用函数的[[Call]]
内置方法(见表)。属性的[[Set]]
内部方法的效果可能(但不是必需)对后续调用该属性的[[Get]]
内部方法所返回的值产生影响。true
,该属性能被for-in
枚举(见13.7.5)。否则,该属性不可枚举。false
,尝试删除该属性,将该属性转换为数据属性或改变该属性的特性(描述符)都会失败。js代码示例:
对象的内部方法和内部插槽
ECMAScript中对象的实际语义是通过称为 内部方法 的算法指定的。ECMAScript引擎中的每个对象都与一组内部方法相关联,这些内部方法定义了其运行时行为。这些内部方法不是ECMAScript语言的一部分。由规范定义,仅出于说明目的。
内部插槽对应于与对象关联并由各种ECMAScript规范算法使用的 内部状态。内部插槽不是对象属性,也不会继承。根据特定的内部插槽规范,这种状态可以由任何 ECMAScript语言类型的值 或 特定的ECMAScript规范类型的值 组成。除非另有明确说明,否则内部插槽将作为创建对象过程的一部分进行分配,并且可能不会动态添加到对象中。除非另有说明,否则内部插槽的初始值为 undefined。规范中的各种算法都会创建具有内部插槽的对象。但是,ECMAScript语言没有提供将内部插槽与对象关联的直接方法。
在规范中,内部方法和内部插槽使用
[[内部方法名 或者 内部插槽名]]
表示(符合Record类型)。下表总结了规范使用的 基本内部方法,这些方法适用于由ECMAScript代码创建或操作的所有对象。每个对象都必须具有用于所有基本内部方法的算法。但是,对于这些方法,所有对象不一定都使用相同的算法。null
表示没有继承属性。Object.getPrototypeOf()null
表示没有继承属性。返回true
表示操作成功,返回false
表示操作失败。(Object.setPrototypeOf())true
表示操作成功,返回false
表示操作失败。(PS:如果为false
,即使[[IsExtensible]]
为true
,添加新属性操作也会失败。Object.preventExtensions())undefined
。Object.getOwnPropertyDescriptor()和Object.getOwnPropertyDescriptors()propertyKey
,属性描述符对应传入的PropertyDescriptor
。如果操作成功返回true
,否则返回false
。(对应Object.defineProperty()和Object.defineProperties())propertyKey
的属性。(对应Object.prototype.hasOwnProperty())propertyKey
的值。如果必须执行ECMAScript代码来找到属性值,参数Receiver
会被当作this
来用。value
设置为对象中属性名为参数propertyKey
的值。参数Receiver
会被当作this
来用。如果操作成功返回true
,否则返回false
。propertyKey
的属性。删除成功返回true
,否则返回false
。(类似js中的delete
关键字)下表总结了函数对象所支持的其他基本内部方法:
any
表示this
,a List of any
表示传入的参数列表。实现此内部方法的对象是可调用的。new
或super
操作调用。a List of any
表示包含运算符参数的列表。第二个参数Object
表示new
操作的初始应用对象。实现该内部方法的对象称为constructors
。函数对象不一定要有constructor
并且非构造函数对象没有[[Construct]]
内部方法。基本内部方法的不变量
定义:
[[IsExtensible]]
内部方法返回false
或者其[[PreventExtensions]]
返回true
,则该对象是不可扩展的。返回值:
任何内部方法的返回值必须是具有以下任一内容的完成记录:
2020-07-27 补充
这里问题关键在于
a.x = a = {n: 2}
这一段,其实a.x
此时应该是{n: 1}
这个对象添加了个新属性x
,a = {n: 2}
则是将a
变量指向新对象!然后{n: 1}
这个对象的x
属性指向{n: 2}
这个对象。The text was updated successfully, but these errors were encountered: