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 ⊙ )啊!
分享
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值