# Object

    class Object extends Any

Object(对象) 是派生其他 AutoHotkey 对象类的基本类. Object 的每个实例都由一组 "自有属性" 和一个基对象组成, 可以从基对象中继承更多的属性. Object 也有方法, 但这些只是可以调用的属性.

有值属性和动态属性. 值属性只是包含一个值. 动态属性不包含一个值, 而是根据访问方式(get, set 或 call) 调用一个 访问函数.

下面使用 "Obj" 作为 Object 类的任何实例的占位符.

所有 Object 的实例都基于 `Object.Prototype`, 而其又基于 `Any.Prototype`. 除了从 Any 继承的方法和属性外, Object 还具有以下预定义的方法和属性:

静态方法:

- Call

方法:

- Clone
- DefineProp
- DeleteProp
- GetOwnPropDesc
- HasOwnProp
- OwnProps

属性:

- Base

函数:

- ObjSetBase: 设置对象的基对象.
- ObjGetCapacity, ObjSetCapacity: 检索或设置对象所包含属性的容量.
- ObjOwnPropCount: 检索对象包含的自有属性的数量.
- ObjHasOwnProp, ObjOwnProps: 等同于相应的预定义方法, 但不能被覆盖.

## 静态方法

## Call

创建一个新对象.

    Obj := Object()

## 方法

## Clone

返回对象的一个浅拷贝.

    Clone := Obj.Clone()

对象拥有的每个属性或方法都被复制到副本中. 对象 引用 被复制(就像普通的赋值一样), 而不是对象本身; 换句话说, 如果属性包含对对象的引用, 则副本将包含对同一对象的引用.

动态属性被复制, 而不是调用.

副本具有与原始对象相同的基对象.

## DefineProp

定义一个新的自有属性.

    Obj.DefineProp(Name, Desc)

Name

  类型: 字符串

  属性的名称.

Desc

  类型: 对象

  具有以下自有属性之一的对象, 或同时具有 Get 和 Set:

  `Get`: 获取属性值时调用的函数对象.

  `Set`: 属性被赋值时调用的函数对象. 第二个参数是要分配的值.

  `Call`: 调用该属性时要调用的函数对象.

  `Value`: 要赋值该属性的任何值.

返回值

  目标对象(Obj).

该方法可用于将值属性转换为动态属性, 反之亦然, 但不可能同时指定一个值和访问函数.

如果省略任何一个访问函数, 行为就会从基对象中继承.

- 一个继承的值属性相当于一组访问函数, 它们返回或调用该值, 或在 `this` 中存储一个新的值. 注意, 一个新的值将覆盖其在 `this` 本身中的任何动态属性, 并覆盖任何继承的访问函数.
- 如果没有定义或继承 Set 或值, 那么试图设置该属性将抛出异常.
- 如果没有定义或继承 Call, 可以调用 Get 来检索一个函数对象, 然后再调用它.
- 如果没有定义或继承 Get, 但有一个 Call 访问函数, 那么函数本身就会成为属性的值(只读).

与方法一样, Get, Set 或 Call 的第一个参数是 `this`(目标对象). 对于 Set, 第二个参数是 `value`(被分配的值). 这些参数由类中的方法和属性定义自动定义, 但如果使用普通函数, 则必须显式定义. 调用者传递的任何其他参数都会附加到参数列表中.

计算函数对象的 `MaxParams` 和 `IsVariadic` 属性, 以确定该属性是否可以接受参数. 如果 get 的 `MaxParams` 为 1, 或 set 的 `MaxParams` 为 2, 并且 `IsVariadic` 为 false 或未定义, 则属性不能接受参数; 它们被转发到由 get 返回的对象的 __Item 属性.

## DeleteProp

删除对象拥有的属性.

    Obj.DeleteProp(Name)

Name

  类型: 字符串

  属性名.

返回值

  删除属性的值(如果没有则为空).

## GetOwnPropDesc

返回给定自有属性的描述符, 兼容于 DefineProp.

    Obj.GetOwnPropDesc(Name)

Name

  类型: 字符串

  属性名.

返回值

  类型: Object

  对于动态属性, 返回值是一个新对象, 其中每个访问函数都有自己的属性: `Get`, `Set`, `Call`. 只有在 Obj 本身定义了相应的访问函数, 每个属性才会存在.

  对于值属性, 返回值是一个新对象, 其属性名为 `Value`. 在这种情况下, `Obj.GetOwnPropDesc(Name).Value == Obj.%Name%`.

除非调用 DefineProp, 否则修改返回的对象对 Obj 没有影响.

如果 Obj 不拥有该名称的属性, 则抛出 PropertyError. 脚本可以通过检查 `not desc.HasProp("Value")` 来确定一个属性是否是动态的, 其中 desc 是 GetOwnPropDesc 的返回值.

## HasOwnProp

    Obj.HasOwnProp(Name)

如果对象拥有该名称的属性, 则返回 true, 否则返回 false.

该方法的默认实现也被定义为一个函数: `ObjHasOwnProp(Obj, Name)`.

## OwnProps

枚举对象自有的属性.

    For Name , Value in Obj.OwnProps()

返回一个新的枚举器. 该枚举器通常直接传递给 for-loop, 循环的每次迭代都调用一次枚举器. 每次对枚举器的调用都会返回下一个属性名和/或其值. for-loop 的变量对应于枚举器的参数, 它们是:

Name

  类型: 字符串

  属性名.

Value

  属性的值.

  如果该属性具有 getter 方法, 则将调用该方法以获得该值(除非省略 Value).

动态属性包含在枚举中. 但是:

- 因为只有对象自有的属性才会被枚举, 所以属性必须在 Obj 中直接定义.
- 如果只指定了第一个变量, 则返回属性的名称, 不调用它的 getter.
- 如果指定了两个变量, 枚举器会尝试调用属性的 getter 来检索值.
  - 如果 getter 需要参数, 则跳过该属性.
  - 如果 Obj 本身没有为该属性定义 getter, 则跳过.
  - 如果 Obj 是一个类原型对象, 则不应该(在某些情况下不能) 调用 getter; 所以跳过该属性.
  - 如果 getter 抛出异常, 它将被传播(而不是被抑制). 调用者只有在保留了对枚举器的引用的情况下, 才能继续对下一个属性进行枚举(例如, 如果直接将枚举器传递给 for-loop, 则不能继续枚举, 因为在这种情况下, 当 for-loop 中止时, 枚举器会被释放).

要在不调用属性获取器(getters) 的情况下枚举自有的属性, 或者要枚举所有的属性而不考虑类型, 只需向 for-loop 或枚举器传递一个变量. GetOwnPropDesc 可以用来区分值属性和动态属性, 同时还可以检索值或获取器/设置器(setter)/方法.

方法通常被排除在双参数模式的枚举之外, 因为属性的计算通常取决于对象是否有相应的 getter 或值(在同一对象或基对象中). 为了避免在指定两个变量时出现不一致, OwnProps 跳过了只有一个 Call 访问函数的自有属性. 例如:

- 如果 OwnProps 在没有定义 getter 的情况下返回方法本身, 那么定义 getter 就会阻止该方法被返回. 依靠双变量模式来检索方法的脚本就会缺失一些方法.
- 如果 OwnProps 在基对象定义了 getter 时返回方法本身, 这将与属性的正常计算结果不一致.

该方法的默认实现也被定义为一个函数: `ObjOwnProps(Obj)`.

## 属性

## Base

检索或设置对象的基对象.

    BaseObj := Obj.Base

    Obj.Base := BaseObj

BaseObj 必须是一个对象.

如果给新基赋值会改变对象的原生类型, 则抛出异常. 对象的原生类型由属于内置类的最近原型对象决定, 例如 `Object.Prototype` 或 `Array.Prototype`. 例如, Array 的实例必须始终直接或间接地从 `Array.Prototype` 派生.

属性和方法是从基对象动态继承的, 因此更改对象的基也会更改哪些可用继承的属性和方法.

属性继承于 Any; 但是, 只能为 Object 的实例设置它.

另请参阅: ObjGetBase, ObjSetBase

## 函数

## ObjSetBase

设置对象的基对象.

    ObjSetBase(Obj, BaseObj)

不调用元-函数或属性函数. 覆盖 Base 属性不会影响此函数的行为.

如果 Obj 或 BaseObj 的类型不正确, 则抛出异常.

另请参阅: ObjGetBase, Base 属性

## ObjOwnPropCount

返回对象拥有的属性的数量.

    Count := ObjOwnPropCount(Obj)

## ObjSetCapacity

设置对象内部自有属性的当前容量.

    ObjSetCapacity(Obj, MaxProps)

MaxProps

  类型: 整数

  新的容量. 如果小于自有属性的当前数量, 则使用该数量, 并释放所有未使用的空间.

返回值

  类型: 整数

  新容量.

如果 Obj 的类型不正确, 则抛出异常.

## ObjGetCapacity

    MaxItems := ObjGetCapacity(Obj)

返回值

  类型: 整数

  对象内部属性的当前容量.

如果 Obj 的类型不正确, 则抛出异常.

dftg