Skip to content
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-对象 #28

Open
Pasoul opened this issue Aug 13, 2019 · 1 comment
Open

重学js-对象 #28

Pasoul opened this issue Aug 13, 2019 · 1 comment

Comments

@Pasoul
Copy link
Owner

Pasoul commented Aug 13, 2019

对象是Js的基本数据类型,对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值。对象也可看做数属性的无序集合,每个属性都是一个名/值对。属性名是字符串,因此我们可以把对象看成是字符串到值的映射。这种基本数据结构有很多叫法:‘字典’、‘散列’、‘散列表’、‘关联数组’等。

然而对象不仅仅是字符串到值的映射,除了可以保持自有的属性,Js对象还可以从一个称为原型的对象继承属性,对象的方法通常是继承的属性,这种“原型式继承”是Js的核心特征。

除了字符串、数字、true、false、null和undefined之外。Js中的值都是对象。

对象是可变的,我们通过引用而非值来操作对象。如果变量x是指向一个对象的引用,那么执行var y = x;,变量y也指向同一个对象的引用,而非这个对象的副本。通过变量y来修改这个对象亦会对x造成印象。

属性包括属性名和属性值,属性名可以是包含空字符串在内的所有字符串,但对象中不能存在两个同名的属性。值可以是任意Js值,或者在ES5中,可以是一个gettersetter函数,除了属性名和属性值之外,每个属性还有一个与之相关的值,称为"属性特性":

  • 可写(writable attribute),表明是否可以设置该属性的值
  • 可枚举(enumerable attribute),表明是否可以通过for/in循环返回该属性
  • 可配置(configurable attribute),表明是否可以删除或修改该属性

在ES5之前,通过代码给对象创建的所有属性都是可写的、可枚举的和可配置的。在ES5中则可以对这些特性加以配置。

除了包含属性之外,每个对象还拥有三个相关的对象特性(object attribute):

  • 对象的原型(prototype)指向另外一个对象,本对象的属性继承自它的原型对象
  • 对象的类(class)是一个标识对象类型的字符串
  • 对象的扩展标记指明了ES5中是否可以向该对象添加新属性

最后,我们用下面这些属于来对三类JS对象和两类属性做区分:

  • 内置对象(native object):是由ECMAScript规范定义的对象或类,例如,数组、函数、日期和正则表达式都是内置对象
  • 宿主对象(host object):由Js解释器所嵌入的宿主环境(比如Web浏览器)定义的。客户端Js中表示网页结构的HTMLElement对象均是宿主对象,既然宿主环境定义的方法可以当成普通的Js函数对象,那么宿主对象也可以当成内置对象
  • 自定义对象(user-defined object):由运行中的Js代码创建的对象
  • 自有属性(own property):是直接在对象中定义的属性
  • 继承属性(inherited property):在对象的原型对象中定义的属性
@Pasoul
Copy link
Owner Author

Pasoul commented Aug 14, 2019

创建对象

可以通过对象直接量、Object.create()函数和new关键字来创建对象。

对象直接量

创建对象最简单的方法是使用对象直接量,对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant