變量下面,屬性是第二個選項來處理類中的數據。然而不像變量,它們提供更多的控制哪種類型的字段訪問被允許,和它如何被生成。通常用處包括:
> Next to variables (4.1), properties are the second option for dealing with data on a class. Unlike variables however, they offer more control of which kind of ?eld access should be allowed and how it should be generated. Common use cases include:
* 有一個可以被從任何地方讀取,但是只能被從定義類寫入的字段
* 有一個調用一個getter方法獲得讀權限的字段
* 有一個調用一個setter方法獲得寫入權限的字段
> * Have a ?eld which can be read from anywhere,but only be written from within the de?ning class.
> * Have a ?eld which invokes a getter-method upon read-access.
> * Have a ?eld which invokes a setter-method upon write-access.
當處理屬性時,重要的是理解兩種類型的訪問:
> When dealing with properties, it is important to understand the two kinds of access:
>[warning] 定義:讀取訪問
> 一個字段的讀取訪問發生在右手字段訪問表達式(第5.7節)使用時。包括通過 obj.field() 形式調用來訪問授權讀取的字段。
> 定義:寫入訪問
> 一個字段的寫入訪問發生在一個字段訪問表達式被以obj.field=value格式賦一個值的時候。也可能和讀取訪問聯合出現,對于特別的賦值操作符如 += ,表達式形如 obj.field += value 。
>[warning] De?nition: Read Access
A read access to a ?eld occurs when a right-hand side ?eld access expression (5.7) is used. This includes calls in the form of obj.field(), where field is accessed to be read.
>[warning] De?nition: Write Access
A write access to a ?eld occurs when a ?eld access expression (5.7) is assigned a value in the form of obj.field = value. It may also occur in combination with read access (4.2) for special assignment operators such as += in expressions like obj.field += value.
讀取訪問和寫入訪問直接反映在語法形式,如下面的例子:
> Read access and write access are directly re?ected in the syntax, as the following example shows:
~~~
class Main {
public var x(default, null):Int;
static public function main() { }
}
~~~
多數情況,和變量的語法類似,實際上適用同樣的規則。屬性被識別,通過
> For the most part, the syntax is similar to variable syntax, and the same rules indeed apply. Properties are identi?ed by
* 字段名后開口的括號 ( ,
* 后面跟一個特定的訪問標識符(這里是 default),
* 逗號,隔開
* 另一個特殊的訪問標識符(這里是null),
* 和一個閉口的括號 )
> * the opening parenthesis ( after the ?eld name,
> * followed by a special access identi?er (here: default),
> * with a comma , separating
> * another special access identi?er (here: null)
> * before a closing parenthesis ).
訪問標識符定義當字段被讀取(第一個標識符)的行為,和寫入的行為(第二個標識符)。接受的值為:
> The access identi?ers de?ne the behavior when the ?eld is read (?rst identi?er) and written (second identi?er). The accepted values are:
**default**:如果字段有公開的可見性,則允許普通的字段訪問,否則等于 null 訪問。
**null**:只允許從定義的類中訪問。
**get/set**:訪問被生成為一個存取器方法。編譯器確保存取器可用。
**dynamic**:類似get/set訪問,但是不驗證存取器字段的存在。
**never**:不允許訪問
> **default**: Allows normal ?eld access if the ?eld has public visibility, otherwise equal to null access.
> **null**: Allows access only from within the de?ning class.
> **get/set**: Access is generated as a call to an accessor method. The compiler ensures that the accessor is available.
> **dynamic**: Like get/set access, but does not verify the existence of the accessor ?eld.
> **never**: Allows no access at all.
**存取器方法**
>[warning] 定義:存取器方法
一個T類型名為 filed 的字段的一個存取器方法(或者簡稱為存取器)是一個Void->T類型名為 get_field 的 getter,或者T->T類型名為 set_field的setter。
>[warning] De?nition: Accessor method
An accessor method (or short accessor) for a ?eld named field of type T is a getter named get_field of type Void->T or a setter named set_field of type T->T.
**存取器名稱**
>[warning] 花絮:存取器名稱
在Haxe 2中,任意的標識符允許作為訪問標識符,可以使定制的存取器方法名是被認可的。這使得部分實現非常難以處理。特別是,Reflect.getProperty() 和 Reflect.setProterty() 必須假定任何名稱可能被使用,需要目標生成器生成元信息和執行查找。我們不允許這些標識符,而使用 get_ 和 set_ 命名約定,大大簡化了實現。這是Haxe2 和Haxe 3之間一個阻斷式的變更。
>[warning] Trivia: Accessor names
In Haxe 2, arbitrary identi?ers were allowed as access identi?ers and would lead to custom accessor method names to be admitted. This made parts of the implementation quite tricky todealwith. In particular,Reflect.getProperty() and Reflect.setProperty() had to assume that any name could have been used, requiring the target generators to generate meta-information and perform lookups. We disallowed these identi?ers and went for the get_ and set_ naming convention which greatly simpli?ed implementation. This was one of the breaking changes between Haxe 2 and 3.
- 空白目錄
- 1.Haxe介紹
- 1.1.Haxe是什么
- 1.2.關于本文檔
- 1.2.1.作者及貢獻者
- 1.2.2.License
- 1.3Hello World
- 1.4.Haxe的歷史
- 2.類型
- 2.1.基本類型
- 2.1.1.數值類型
- 2.1.2.溢出
- 2.1.3.數值運算符
- 2.1.4.Bool類型
- 2.1.5.Void類型
- 2.2.為空性
- 2.2.1.可選參數和為空性
- 2.3.類實例
- 2.3.1.類的構造函數
- 2.3.2.繼承
- 2.3.3.接口
- 2.4.枚舉實例
- 2.4.1.Enum構造函數
- 2.4.2.使用枚舉
- 2.5.匿名結構
- 2.5.1.結構值的JSON形式
- 2.5.2. 結構類型的類記法
- 2.5.3.可選字段
- 2.5.4.性能影響
- 2.6.函數類型
- 2.6.1.可選參數
- 2.6.2.默認值
- 2.7.動態類型
- 2.7.1.Dynamic使用類型參數
- 2.7.2.實現Dynamic
- 2.8.抽象類型
- 2.8.1.隱式類型轉換
- 2.8.2.運算符重載
- 2.8.3.數組訪問
- 2.8.4.選擇函數
- 2.8.5.枚舉抽象類型
- 2.8.6.轉發抽象類型字段
- 2.8.7.核心類型抽象
- 2.9.單形
- 3.類型系統
- 3.1.Typedef
- 3.1.1.擴展
- 3.2.類型參數
- 3.2.1.約束
- 3.3.泛型
- 3.3.1.泛型類型參數解釋
- 3.4.變異
- 3.5.統一
- 3.5.1.類/接口 之間
- 3.5.2.結構子類型化
- 3.5.3.單形
- 3.5.4.函數返回
- 3.5.5.通用基本類型
- 3.6.類型推斷
- 3.6.1.由上而下推斷
- 3.6.2.局限
- 3.7.模塊和路徑
- 3.7.1.模塊子類型
- 3.7.2.Import
- 3.7.3.解析順序
- 4.類字段
- 4.1.變量
- 4.2.屬性
- 4.2.1.常見訪問標識符組合
- 4.2.2.對類型系統的影響
- 4.2.3.getter和setter的規則
- 4.3.方法
- 4.3.1.重寫方法
- 4.3.2.變異和訪問修飾符的影響
- 4.4.訪問修飾符
- 4.4.1.可見性
- 4.4.2.Inline
- 4.4.3.Dynamic
- 4.4.4.Override
- 4.4.5.Static
- 5.表達式
- 5.1.塊
- 5.2.常量
- 5.3.二元操作符
- 5.4.一元操作符
- 5.5.數組聲明
- 5.6.對象聲明
- 5.7.字段訪問
- 5.8.數組訪問
- 5.9.函數調用
- 5.10.var
- 5.11.局部函數
- 5.12.new
- 5.13.for
- 5.14.while
- 5.15.do-while
- 5.16.if
- 5.17.switch
- 5.18.try/catch
- 5.19.return
- 5.20.break
- 5.21.continue
- 5.22.throw
- 5.23.類型轉換
- 5.23.1.不安全轉換
- 5.23.2.安全轉換
- 5.24.類型檢查
- 6.語言特性
- 6.1.條件編譯
- 6.2.Externs
- 6.3.靜態擴展
- 6.3.1.標準庫中的靜態擴展
- 6.4.模式匹配
- 6.4.1.介紹
- 6.4.2.枚舉匹配
- 6.4.3.變量捕獲
- 6.4.4.結構匹配
- 6.4.5.數組匹配
- 6.4.6.Or 模式
- 6.4.7.守護
- 6.4.8.多個值的匹配
- 6.4.9.提取器
- 6.4.10.窮盡性檢查
- 6.4.11.無效的模式檢查
- 6.5.字符串插值
- 6.6.數組推導
- 6.7.迭代器
- 6.8.函數綁定
- 6.9.元數據
- 6.10.訪問控制
- 6.11.內聯構造函數
- 7.編譯器用法
- 7.1.編譯器標記
- 8.編譯器功能
- 8.1.內建編譯器元數據
- 8.2.無用代碼消除
- 8.3.編譯器服務
- 8.3.1.概述
- 8.3.2.字段訪問完成
- 8.3.3.調用參數完成
- 8.3.4.類型路徑完成
- 8.3.5.使用完成
- 8.3.6.位置完成
- 8.3.7.頂級完成
- 8.3.8.完成服務
- 8.4.資源
- 8.4.1.嵌入資源
- 8.4.2.檢索文本資源
- 8.4.3.檢索二進制資源
- 8.4.4.實現細節
- 8.5.運行時類型信息
- 8.5.1.RTTI 結構
- 8.6.靜態分析儀
- 9.宏
- 9.1.宏上下文
- 9.2.參數
- 9.2.1.ExprOf
- 9.2.2.常數表達式
- 9.2.3.其它的參數
- 9.3.具體化
- 9.3.1.表達式具體化
- 9.3.2.類型具體化
- 9.3.3.類具體化
- 9.4.工具
- 9.5.類型構建
- 9.5.1.枚舉構建
- 9.5.2.@:autoBuild
- 9.5.3.@:genericBuild
- 9.6.限制
- 9.6.1.Macro-in-Macro
- 9.6.2.靜態擴展
- 9.6.3.構建順序
- 9.6.4.類型參數
- 9.7.初始化宏
- 10.標準庫
- 10.1.字符串
- 10.2.數據結構
- 10.2.1.數組
- 10.2.2.向量
- 10.2.3.列表
- 10.2.4.GenericStack
- 10.2.5.Map
- 10.2.6.Option
- 10.3.正則表達式
- 10.3.1.匹配
- 10.3.2.分組
- 10.3.3.替換
- 10.3.4.分割
- 10.3.5.Map
- 10.3.6.實現細節
- 10.4.Math
- 10.4.1.特殊數值
- 10.4.2.數學錯誤
- 10.4.3.整數數學
- 10.4.4.擴展
- 10.5.Lambda
- 10.6.模板
- 10.7.反射
- 10.8.序列化
- 10.8.1.格式化序列化
- 10.9.Xml
- 10.9.1.開始使用Xml
- 10.9.2.解析Xml
- 10.9.3.編碼Xml
- 10.10.Json
- 10.10.1.解析JSON
- 10.10.2.編碼JSON
- 10.10.3.實現細節
- 10.11.Input/Output
- 10.12.Sys/sys
- 10.13.遠程處理
- 10.13.1.遠程連接
- 10.13.2.實現細節
- 10.14.單元測試
- 11.Haxelib
- 11.1.Haxe編譯器使用庫
- 11.2.haxelib.json
- 11.2.1.版本控制
- 11.2.2.依賴關系
- 11.3.extraParams.hxml
- 11.4.使用Haxelib
- 12.目標平臺細節
- 12.1.JavaScript
- 12.1.1.開始使用Haxe/JavaScript
- 12.1.2.使用外部JavaScript庫
- 12.1.3.注入原生JavaScript
- 12.1.4.JavaScript untyped函數
- 12.1.5.調試JavaScript
- 12.1.6.JavaScript目標元數據
- 12.1.7.為JavaScript暴露Haxe類
- 12.1.8.使用 require函數加載外部類
- 12.2.Flash
- 12.2.1.開始使用Haxe/Flash
- 12.2.2.嵌入資源
- 12.2.3.使用外部Flash庫
- 12.2.4.Flash目標元數據
- 12.3.Neko
- 12.4.PHP
- 12.4.1.開始使用Haxe/PHP
- 12.4.2.PHP untyped函數
- 12.5.C++
- 12.5.1.Using C++定義
- 12.5.2.Using C++ 指針
- 12.6.Java
- 12.7.C#
- 12.8.Python