Object類不常用的方法講解 (轉載)

原文鏈接地址:http://www.xiaos8.com/article.asp?id=395
我嘛,就喜歡講一些偏門的東西,針對新手看幫助文檔,可能他根本不明白他是什麼意思,而大家對偏門的東西討論也少,看不懂也就算了,以後也沒注意了,但有時候偏門的東西非常有用,接下來講講任何一個類都有的方法,也就是AS3面向對象中的老祖宗Object類所擁有方法
 
1、Object.hasOwnProperty(name:String):Boolean
官方幫助文檔
指示對象是否已經定義了指定的屬性。 如果目標對象具有與 name 參數指定的字符串匹配的屬性,則此方法返回 true;否則返回 false。
乍一看幫助文檔所說的,好像這個方法是用來檢查對象是否擁有name參數所指定的匹配屬性,其實不然
大家都知道一個類都有屬性和方法,其實每個類所有的方法,是可以用屬性的方法獲取到該function的引用
比如,事件偵聽
stage.addEventListener(MouseEvent.CLICK,clickHandler);
private function clickHandler(e:MouseEvent):void{
trace("點擊");
}


上面這個clickHandler所返回的就是function clickHandler的引用
你也可以試試
tarce(clickHandler)
// trace: function Function() {}
那麼說,其實hasOwnProperty,也可以檢查該類是否含有某方法,明白這個方法的用法了吧?另外也請注意下面幾條
官方幫助文檔
以下類型的屬性導致該方法對屬於類實例的對象(而不是類對象)返回 true:
固定實例屬性 — 對象類定義的非靜態變量、常量或方法;
繼承的固定實例屬性 — 對象類繼承的變量、常量或方法;
動態屬性 — 對象實例化後添加到其中的屬性(在其類定義之外)。 若要添加動態屬性,必須用 dynamic 關鍵字聲明對象的定義類。
以下類型的屬性導致該方法對屬於類實例的對象返回 false:

靜態屬性 -- 在對象的定義類或其任何超類中使用靜態關鍵字定義的變量、常量或方法;
原型屬性 -- 在原型對象上定義的屬於對象原型鏈一部分的屬性。 在 ActionScript 3.0 中,雖然原型鏈不用於類繼承,但仍可作爲繼承的一種替代形式存在。 例如,Array 類的一個實例可以訪問 valueOf() 方法,因爲它位於屬於 Array 類原型鏈一部分的 Object.prototype 上。 雖然可以在 Array 實例中使用 valueOf(),但對該實例返回的 hasOwnProperty("valueOf") 值爲 false。
怕新手不明白原型屬性是什麼意思,那麼你也不需要明白了,只需要記住在官方幫助文檔上,每個類方法的介紹上面,都會有個命名空間,如果這個地方寫的是AS3,而不是public或者其他,那麼就說明他是原型屬性,通過hasOwnProperty是判斷不出來的(如下圖)

圖片地址:uploads/200903/10_223819_1.jpg

但有些是public也是會出現無法正確判斷,但正常使用該方法的時候,一般都是對自己所寫的類進行判斷,對系統的類一般都沒什麼需要判斷的,因此此問題不大
 
2、Object.propertyIsEnumerable(name:String):Boolean
官方幫助文檔
指示指定的屬性是否存在、是否可枚舉。 如果爲 true,則該屬性存在並且可以在 for..in 循環中枚舉。
按上面說的,應該很容易就能理解,如果不理解就看看下面這段示例代碼,另外要記住,您創建的屬性是可枚舉的,但是內置屬性通常是不可枚舉的。
var list:Array = new Array;
list[5] = "a";
list.a = "gg";
trace(list.propertyIsEnumerable("length")); // false
trace(list.propertyIsEnumerable(5)); // true
trace(list.propertyIsEnumerable("a")); // true
trace(list.propertyIsEnumerable("b")); // false
trace(list.propertyIsEnumerable(0)); // false

 
3、Object.setPropertyIsEnumerable(name:String, isEnum:Boolean = true):void
官方幫助文檔
設置循環操作動態屬性的可用性。
isEnum:Boolean (default = true) — 如果設置爲 false,則動態屬性不會顯示在 for..in 循環中,且方法 propertyIsEnumerable() 返回 false。
如果明白propertyIsEnumerable方法是什麼意思,那麼這個就不難了,繼續看下面一段示例代碼吧:
var arg:Object = new Object;
arg.a = "aa";
arg.b = "bb";
arg.c = "cc";
trace(arg.propertyIsEnumerable("a")); // true
arg.setPropertyIsEnumerable("a",false);
trace(arg.propertyIsEnumerable("a")); // false;
for(var index:String in arg){
trace(index); // b, c
}

就是說通過該方法,可以讓你使用for...each遍歷的時候,不遍歷你設置爲false的動態屬性
我相信應該很容易理解吧?而且還有代碼說明
 
好了,今天講到這了,瞭解瞭解吧。。
以後會多點時間去寫FireAS框架,技術文章更新不會太頻繁額(其實我一直都不是很頻繁了,嘿嘿)
( ⊙ o ⊙ )啊!
分享
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章