反射(reflectiong),这让我想起了struts2中的反射机制,对于反射的理解在学习struts2中有着很大的作用,但是这里很惭愧啊,自己还没充分弄清楚~~~
JavaScript对象的反射
在一些情况下,我们需要能够在对对象完全不了解的情况下进行处理,并且在处理它们之前发现它们的属性和方法的性质。这个发现的过程称作反射(reflection)。
需要发现一个JavaScript对象是否支持一个特定的属性或方法,我们也简单地测试如下:
if(MyObject.someProperty)
{
……
}
注:这个测试可能失败,原因是MyObject.someProperty可以为false,数字0或者特殊值null。
严格的测试如下:
if(typeof(MyObject.someProperty) != “undefined”)
{
……
}
识别属性的类型测试如下:
if(myObj instanceof MyObject) /*可以为内建类Array,Object或者通过构造函数来定义的类定义(用户定义类型)*/
{
……
}
注:使用instanceof来测试自定义类,有必要知道两个陷阱(gotcha)。首先,JSON不支持它——任何使用JSON创建的东西要么是一个JavaScript Object,要么是一个Array。其次,内建的对象确实支持存在于它们中间的继承。例如,Function和Array都是继承自Object,所以测试的顺序是相关的。例子如下:
function testType(myObj)
{
if(myObj instanceof Object)
{
alert(“it’s an objecet”);
}
else if(myObj instanceof Array)
{
alert(“it’s an array”);
}
}
testType([1,2,3,4]);
想想该是输出哪个结果,[1,2,3,4]是一个Array,但是不要奇怪,输出的是Object,判断换一下呢,恩,是的,输出的就是array了。
好了,接下来我们做得全面点,无遗漏得去发现一个对象的所有属性和函数:
function MyObject()
{
this.color = ‘red’;
this.flavor = ‘strawberry’;
this.azimuth = ’45 degrees’;
this.favoriteDog = ‘collie’;
}
var myObj = new MyObject();
var debug = “discovering…\n”;
for(var i in myObj) /*这个i取到的是myObj的属性名!如果需要取得属性名对应的值可以使用for each(var I in myObj),关于for的用法可以去网上搜下*/
{
debug += i + “ -> “ + myObj[i] + “\n” ;
}
alert(debug);
说明:这个循环将会执行四次,返回所有设置在构造函数中的值。
好了接下去我们需要学习面向对象的另一个特征:虚类或者接口。那么等下见~~codd饿了~~~
JavaScript对象的反射
在一些情况下,我们需要能够在对对象完全不了解的情况下进行处理,并且在处理它们之前发现它们的属性和方法的性质。这个发现的过程称作反射(reflection)。
需要发现一个JavaScript对象是否支持一个特定的属性或方法,我们也简单地测试如下:
if(MyObject.someProperty)
{
……
}
注:这个测试可能失败,原因是MyObject.someProperty可以为false,数字0或者特殊值null。
严格的测试如下:
if(typeof(MyObject.someProperty) != “undefined”)
{
……
}
识别属性的类型测试如下:
if(myObj instanceof MyObject) /*可以为内建类Array,Object或者通过构造函数来定义的类定义(用户定义类型)*/
{
……
}
注:使用instanceof来测试自定义类,有必要知道两个陷阱(gotcha)。首先,JSON不支持它——任何使用JSON创建的东西要么是一个JavaScript Object,要么是一个Array。其次,内建的对象确实支持存在于它们中间的继承。例如,Function和Array都是继承自Object,所以测试的顺序是相关的。例子如下:
function testType(myObj)
{
if(myObj instanceof Object)
{
alert(“it’s an objecet”);
}
else if(myObj instanceof Array)
{
alert(“it’s an array”);
}
}
testType([1,2,3,4]);
想想该是输出哪个结果,[1,2,3,4]是一个Array,但是不要奇怪,输出的是Object,判断换一下呢,恩,是的,输出的就是array了。
好了,接下来我们做得全面点,无遗漏得去发现一个对象的所有属性和函数:
function MyObject()
{
this.color = ‘red’;
this.flavor = ‘strawberry’;
this.azimuth = ’45 degrees’;
this.favoriteDog = ‘collie’;
}
var myObj = new MyObject();
var debug = “discovering…\n”;
for(var i in myObj) /*这个i取到的是myObj的属性名!如果需要取得属性名对应的值可以使用for each(var I in myObj),关于for的用法可以去网上搜下*/
{
debug += i + “ -> “ + myObj[i] + “\n” ;
}
alert(debug);
说明:这个循环将会执行四次,返回所有设置在构造函数中的值。
好了接下去我们需要学习面向对象的另一个特征:虚类或者接口。那么等下见~~codd饿了~~~