• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Vic_Yip
博客园    首页    新随笔    联系   管理    订阅  订阅

Object类不常用的方法讲解(转)

原文出自:http://www.xiaos8.com/article.asp?id=395
更多AS3相关的精彩文章请访问:sunbright博客——小s吧 http://www.xiaos8.com
或者访问天地会sunbright文章集合贴:http://flash.9ria.com/thread-40746-1-1.html

针对新手看帮助文档,可能他根本不明白他是什么意思,而大家对这些东西讨论也少,看不懂也就算了,以后也没注意了,但有时候这些东西非常有用,接下来讲讲任何一个类都有的方法,也就是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是判断不出来的(如下图)

但有些是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的动态属性

posted @ 2013-05-13 14:28  vic.ye  阅读(214)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3