JavaScript 对象 Object

Javascript对象机制

Object

  • 任何一个对象都是唯一的,这个与它本身的状态并不相关。
  • 即使完全一致的两个对象,也会完全不相等。
  • 我们用状态来描述一个对象。
  • 状态的改变即是行为。
  • 标志性(identifier 我叫做表示或者声明)指针(state)行为(behavior)

写到这里的时候,突然想起来个事情,在 winter 老师的课程里面,我们描述一个对象的各个行为的时候,定义object.function 一定要去改变这个 state,就是说function 的起名,也要跟 state 有关,而不是去定义一个动作,而是定义动作改变了状态。

抽象对象时,应该遵循‘行为改变状态’的原则,行为改变自身状态。不应该按照语言描述的行为进行设计。

基于类的面向对象

  • 类是一种常见的描述对象的方式。而“归类”和“分类”则是两个主要的流派。
  • 对于“归类”方法而言,多继承是非常自然的事情。如C++。(多继承太绕了,但是单继承好,在我看来….这里不引战争)。
  • 而采用分类思想的计算机语言,则是单继承结构。并且会有一个基类Object。
  • 原型是一种更接近人类原始认知的描述对象的方法。
  • 我们并不试图做严谨的分类,而是采用“相似”这样的方式去描述对象。
  • 任何对象仅仅需要描述它自己与原型的区别即可。
Object API
  • 基础API

    {} . [] Object.defineProperty

  • 原型API

    Object.create Object.setPrototypeOf Object.getPrototypeOf

  • 基于类的面向对象API(模拟)

    new class extends

  • 基于原型的面向对象API

    new function prototype

Object in Javascript

  • 在Javascript运行时,原生对象的描述方式非常简单。我们只需要关心原型和属性两个部分。

  • 它的原型实际上就是一个KV对。

  • Javascript用属性来统一抽象对象状态和行为。

  • 一般来说,数据属性用于描述状态,访问器属性则用于描述行为。

  • 数据属性中如果存储函数,也可以用于描述行为。

JavaScript 中的对象

基本对象

基本对象是定义或使用其他对象的基础。基本对象包括一般对象、函数对象和错误对象。

一般对象、函数对象
  • Object
  • Function
  • Boolean
  • Symbol
错误对象

错误对象是一种特殊的基本对象。它们拥有基本的 Error 类型,同时也有多种具体的错误类型。

  • Error(通过Error的构造器可以创建一个错误对象。当运行时错误产生时,Error的实例对象会被抛出。Error对象也可用于用户自定义的异常的基础对象。)

    new Error([message[, fileName[,lineNumber]]]) 
    
  • AggregateError

  • EvalError

  • RangeError(标明一个错误,当一个值不在其所允许的范围或者集合中。)

  • ReferenceError(代表当一个不存在的变量被引用时发生的错误。)

  • SyntaxError(对象代表尝试解析语法上不合法的代码的错误。)

  • TypeError(对象用来表示值的类型非预期类型时发生的错误。

语法)

  • URLError(URIError 对象用来表示以一种错误的方式使用全局URI处理函数而产生的错误。)

数字和日期对象

用来表示数字、日期和执行数学计算的对象。

  • Number
  • BigInt(它提供了一种方法来表示大于 253 - 1 的整数。这原本是 Javascript中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。)
  • Math
  • Date

字符串

用来表示和操作字符串的对象。

  • String
  • RegExp

可索引的集合对象

表示按照索引值来排序的数据集合,包括数组和类型数组,以及类数组结构的对象。

  • Array
  • Int8Array(表示二进制补码8位有符号整数的数组。内容初始化为0。 一旦建立,你可以使用对象的方法引用数组中的元素,或使用标准数组索引语法( 即,使用括号注释)。)
  • Uint8Array(表示一个8位无符号整型数组,创建时内容被初始化为0。创建完后,可以以对象的方式或使用数组下标索引的方式引用数组中的元素。)
  • Uint8ClampedArray((8位无符号整型固定数组) 类型化数组表示一个由值固定在0-255区间的8位无符号整型组成的数组;如果你指定一个在 [0,255] 区间外的值,它将被替换为0或255;如果你指定一个非整数,那么它将被设置为最接近它的整数。(数组)内容被初始化为0。一旦(数组)被创建,你可以使用对象的方法引用数组里的元素,或使用标准的数组索引语法(即使用方括号标记)。)
  • Int16Array
  • Uint16Array
  • Int32Array
  • Uint32Array
  • Float32Array
  • Float64Array
  • BigInt64Array
  • BigUint64Array

使用键的集合对象

这些集合对象在存储数据时会使用到键,包括可迭代的Map 和 Set,支持按照插入顺序来迭代元素。

  • Map
  • Set
  • WeakMap(一组键/值对的集合,其中的键是弱引用的。)
  • WeakSet(对象允许你将弱保持对象存储在一个集合中。)

结构化诗句

这些对象用来表示和操作结构化的缓冲区数据,或使用 JSON (JavaScript Object Notation)编码的数据。

  • ArrayBuffer(表示通用的、固定长度的原始二进制数据缓冲区。它是一个字节数组,你不能直接操作 ArrayBuffer 的内容,而是要通过类型数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。)
  • DataView(视图是一个可以从 二进制ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序问题。)
  • JSON

控制抽象对象

  • Promise
  • Generator
  • GeneratorFunction
  • AsyncFunction
  • Iterator
  • AsyncIterator

反射

  • Reflect(它提供拦截 JavaScript 操作的方法。这些方法与proxy handlers的方法相同。Reflect不是一个函数对象,因此它是不可构造的。)
  • Proxy(用于定义基本操作的自定义行为(如属性查找、赋值、枚举、函数调用等))

js中特殊的对象

  • Function Object

    • [[call]] 视为函数Function
    • [[Construct]] 可以被new 操作符调用,根据new的规则返回对象。
  • Array Object

    • [[DefineOwnProperty]]

      • Property == length

        设置对象的length属性,根据length的变化对对象进行操作

        newLength > length 用空扩充数组

        newLength < length 截取数组

  • String Object

    string的length是不可写不可配的。

  • Arguments Object

    [[callee]] 视为函数参数对对象,伪数组 caller

  • Object

    [[Get]] property被访问时调用 get

    [[Set]] property被赋值时调用 set

    [[GetPrototypeOf]] 对应getPrototypeOf方法 获取对象原型

    [[SetPrototypeOf]] 对应setPrototypeOf方法 设置对象原型

    [[GetOwnProperty]] getOwnPropertyDescriptor 获取对象私有属性的描述列表

    [[HasProperty]] hasOwnProperty 私有属性判断

    [[IsExtensible]] isExtensible对象是否可扩展

    [[PreventExtensions]] preventExtension控制对象是否可以添加属性

    [[DefineOwnProperty]] defineProperty 定义对象属性

    [[Delete]] delete 操作符

    [[OwnPropertyKeys]] Object.keys() Object.entries() Object.values()

    [[Call]] 能够调用call

  • Module Namespece

    [[Module]] 视为一个引入的模块

    [[Exports]] 视为一个导出的模块

posted @ 2020-06-11 16:25  jaiodfjiaodf  阅读(179)  评论(0编辑  收藏  举报