Javascript 在 web 应用开发使用非常的频繁,它可以轻易帮助我们实现数据验证,完成特殊效果或动作。今天我们就来谈谈 Javascript 的一些事。
JavaScript 对象
看到“对象”二字,听惯面向对象编程的你,是否第一感觉是要有个类,然后进行实例化生成一个对象? Javascript 恰恰相反,它没有 “类”的概念。分“类”有助于我们理解和使用东西,但是在我们享受这些福利的同时“类”也限制了我们的思想,编程应该是自由的, Javascript 抛弃了类的概念,从而也解放了我们。接下来我们看一下 Javascript 是怎么海阔天空的。
示例一:
var testObj = {}; testObj.name = "testObj"; //testObj.name.firstName = "a"; //简单数据类型不是对象,所以不能给它加属性 testObj.remark = "您可以给我随便加属性"; …… alert(testObj.name); alert(testObj.remark);
示例中我首先创建了一个对象 testObj , 一开始它里面什么都没有,空的,什么都不能做,然后我给它加了一个名字属性,再给它加了个备注属性,它开始成为一个“具体”的东西了(当然你还可以给它加 方法),之后你就可以使用这里面的这些属性和方法了。如果你对这些属性和方法不满意,你还可以随时删除它们,或者新增其他的属性和方法。
示例二:
// 接示例一脚本
TestObj.say = function(){ //增加一个说话的方法 alert(“Hi!我可以说话了!”); }; TestObj.name = undefined; //我不想让人知道我的名字,删掉这个属性
Javascript 的是可以随意删掉对象里的属性和方法的,删除方法很简单,就是把这个属性或方法置为 undefined 。 Javascript 中找不到某个对象或方法时就会提示你“ undefined ”(未定义),于是我们要删除对象的某个属性时就强制把它设置为 undefined ,就是告诉解析器这个属性我不要了,如果下面的脚本要使用它,就跟它们说没了。
也许你注意到示例一中的被注释掉的红色代码了,没错,我是想告诉你,简单数据类型(包括 string 、 number 、 null 、 boolean 、 undefined )它们都不是对象,不能使用对象的这些特性。
函数( function )
函数有两种定义方式:定义式和变量式。
示例三:
function funcA(){ alert(“定义式!”); } var funcB = function(){ alert(“变量式!”); }
这两种写法几乎等价的,细微的不同点在于定义式创建时函数会在脚本执行前就被声明了(后面讲 javascript 脚本执行方式会提及),我们可以在脚本的任何地方使用这个函数。变量式创建函数时则不行,如果我们在创建前使用这个函数,那是不可能成功的。
我们可以认为, Javascript 的函数就是一个特殊的变量 , 变量类型 function ,变量名 : funcB ,变量值 : 函数代码体代码,这个变量的变量值可以执行的,同样,作为一个变量,它也是可以进行赋值的。
示例四:
var funcA = function (){ alert("funcA"); }; funcA();//输出funcA funcA = function (){ alert("funcB"); }; funcA();//输出funcB
函数具有对象的全部特征。同样你可以对函数内部的属性进行增加删除。
示例五:
// 接示例四脚本
funcA.name = “funcA”; //我有名字了 alert(“大家好!我叫”+ funcA.name); funcA.name = undefined; //我的名字被剥夺了! Javascript支持重载吗? Javascript是不支持重载的。 示例六: function funcA(str1, str2){ alert(str1 + “ and ” + str2); } function funcA(str1){ alert(str); } funcA(“a”,”b”); //输出 a funcA(“a”); //输出 a
在 Javascript 中后声明的函数会覆盖掉前面声明的函数,这里的第二个函数才是有效的,当你传两个参数时,第二个参数会被忽略掉。
如果你实在是想重载怎么办?那么我告诉你一种方法吧。
我称之为“伪重载”,其实这里连“伪”都谈不上,因为我们只是利用 javascript 函数的一个特性,在同一个函数上打主意,让人看起来这个函数被重载了一样。
Javascript 函数有个特性,他可以灵活的传递参数的个数。
示例七:
function func2(a,b,c){ alert("a+b="+(a+b)); if(c){ alert("a+b+c="+(a+b+c)); } } func2(1,2); //输出a+b=3 func2(1,2,3); //输出a+b+c=6
Javascript 脚本在执行时是不管函数定义时有多少个参数的,一切皆由你来控制。这是否能满足你的要求呢?
JavaScript 脚本执行方式
JavaScript 执行引擎并非一行一行地分析和执行程序,而是一段一段( 为一段)地分析执行的。而且,在同一段程序的分析执行中,定义式的函数语句会被提取出来优先执行。函数定义执行完之后,才会按顺序执行其他语句代码,另外名称相同的函数后定义的函数会覆盖掉前面声明的函数。
示例八:
第一个 script 段中在第一次调用 func 之前,第一个函数语句定义的代码逻辑,已被第二个函数定义语句覆盖了。所以,两次都调用都是执行最后一个函数逻辑了,而第二个 script 段的 func 没受到影响。
Javascript 虽然是脚本型语言,简单、易用,但它还有很多特性或技巧还值得我们去深究,我们只有不断去发掘才会写出更优雅的代码来。