“Everythingnbsp;isnbsp;Object”,在面向对象的编程语言中谁都知道这句话,但对我来说这是一种感觉,只可意会很难言传。由于我对JavaScript和薄弱,所以在看Asp.netnbsp;Ajax类库的同时也翻出了ECMAScript顺便学习学习。在.NET中所有类都是继承自Object,同样在JS中也一样说有都继承Object,因此如果对Object进行了扩展,那所有继承Object类的后代肯定会拥有祖先的血缘。
既然开始学习JavaScript那就顺便在这里提一提他的原始数据类型,在JS中有5个原始数据类型(Undefined、Null、Boolean、Number、String),可以通过typeof来判断变量和值的数据类型
1.nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Undefined:nbsp;当变量被声明但没有被初始化,或函数没有明确返回一个值的时候,该变量或函数即为nbsp;Undefinednbsp;类型,是Null类型的一种特性。
2.nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Null:nbsp;当一个对象的值不存在时,该对象返回null。
3.nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Boolean:一看就知道,一男一女true/false,值得注意的是0不等于false,但是可以转化为false。
4.nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Number:可以定义32位整型数据或64位浮点型数据。从网上的一些资料知道,浮点数在未被计算之前是以String类型存储(不知道是真是假)。当浮点类型数据很大或很小时(可以前后移动六位),将使用E表示法来表示浮点数据,最大可以存储17位数据。另外,isFinite()方法可以判断一个数值是否有限,isNaN()方法可以判断一个数据是非数字类型。通过parseInt()和parseFloat()可以将其他类型转化为数字类型,如果转化不成功则返回NaN(Notnbsp;anbsp;Number)。
5.nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;String:这是一个唯一没有大小限制的原始类型,其他类型可以通过toString()转化为String类型,值得一提的是数字转化为String类型可以加入2.8.16作为参数已输出二进制,八进制和十六进制的字符串。
下面我们来看一下Object类型,通过varnbsp;obj=newnbsp;Object();可以申明一个对象。同.NET中的Object一样,它是所有类的基类。
它具有两个属性:constructor(相当于.NET中的构造函数)建议一个对象函数引用,对于Object类而言,该引用指向本地Object()方法。Prototype对象里prototype对象的一个引用值,通过这个属性可以反射每个对象中的prototype扩展的属性和方法,在Asp.netnbsp;Ajax中也是利用这个属性类扩展和反射类的。
hasOwnProperty(property)—判断property属性是否存在于对象中,property数据类型为string;isPrototypeOf(object)—nbsp;判断一个对象是否是另一对象的nbsp;prototype;propertyIsEnumerable(property)—nbsp;判断所给出的属性能否使用nbsp;fornbsp;语句列举出来;toString()—返回对象的原始类型string;valueOf()—返回对象合适的原始值,对于多数类而言,返回的值和toString()相同。这些就是原始Object对象的方法,在其他类中这些方法以同样被继承。
在Asp.NETnbsp;Ajax中微软为了将整个类库扩展的更适合.NET的开发人员,在原始的Object对象中扩展了两个方法:
Object.__typeName="Object";
Object.getType=function(b){
nbsp;nbsp;varnbsp;a=b.constructor;
nbsp;nbsp;if(!a||typeofnbsp;a!=="function"||!a.__typeName||a.__typeName==="Object")returnnbsp;Object;
nbsp;nbsp;returnnbsp;a
};
Object.getTypeName=function(a){
nbsp;nbsp;returnnbsp;Object.getType(a).getName()
};
从上面我们可以看到,Object.getType(type)这个静态方法可以获取一个类的对象,而Object.getTypeName(type)通过调用[prototype]Type.getName()而获取类的名(包括命名空间)。这没有什么好说的,下面来看一下测试:
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;lt;asp:ScriptManagernbsp;ID="ScriptManager1"nbsp;runat="server"nbsp;/gt;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;lt;divgt;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;lt;scriptnbsp;language="javascript"gt;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;Type.registerNamespace("NExplus");
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//definenbsp;anbsp;class;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;NExplus.ObjectTest=function(name){
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;this._name=name;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;NExplus.ObjectTest.prototype.getName=function(){
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;returnnbsp;(this._namenbsp;===nbsp;undefined)nbsp;?nbsp;nullnbsp;:nbsp;this._name;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;NExplus.ObjectTest.prototype.setName=function(name){
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;this._name=name;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//registernbsp;class;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;NExplus.ObjectTest.registerClass("NExplus.ObjectTest");
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;NExplus.TestObject=function(){
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;varnbsp;a=newnbsp;NExplus.ObjectTest("Testnbsp;isnbsp;success?");
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;document.write(a.getName());
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;document.write("lt;br/gt;");
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;a.setName("Success!");
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;document.write(a.getName());
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;document.write("lt;br/gt;");
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;document.write(Object.getTypeName(a)+"lt;br/gt;")
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;//run;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;NExplus.TestObject();
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;lt;/scriptgt;
nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;lt;/divgt;
运行结果:
Testnbsp;isnbsp;success? Success! NExplus.ObjectTest
nbsp;nbsp;nbsp;这个比较简单,微软只是为了和.NET框架更接近而扩展的Object类,我觉得这两个在开发过程中应该很少用到吧,上面的测试顺便测试一下属性J。我很想知道有没有那个好心人翻译了ECMAScript的规范文档,看英文真的好类;lt;.顺便附上一只捆牢我的两个操作符:nbsp;||:从第一个开始,遇到有意义的返回,否则返回最后一个表达式(不一定是Boolean值);nbsp;:从第一个开始,遇到无意义(0,null,undefined,"",false,NaN)的返回,否则返回最后一个表达式(不一定是Boolean值)。
(编辑:源码门户网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|