这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
但 javascript 中并没有类概念,所谓的类也是模拟而来,通过函数加闭包模拟出类成员及私有成员 (关于闭包可以参见跨越边界: 闭包)。这里我们将用比较平实的方式来了解一下 javascript 中的 "类",避开一些生硬的原理。
function 在 javascript 中用来创建函数或方法,但要想实现面向对象方式的编程,类是不可或缺的角色之一,而且是主角。
既然是用 function 来模拟类,所以编写代码创建类的关键字还是 function。我们创建一个座标点类。
- functionPoint() {
- this.X = 0;
- this.Y = 0;
- };
- var zeroPoint = new Point();
- alert("当前座标值( X:"+ zeroPoint.X +" , Y:"+ zeroPoint.Y +" )");
大家都知道非静态类成员的访问需要通过对象来完成,所以先 new 出了一个 Point 类型对象,再通过该对象完成 X 和 Y 轴座标值的访问。从语法上来说,javascript 类对象的创建过程和 C# 等差不多,但实现机制却不相同。这里的 new 创建出了一个 Object,后续的 Point() 函数执行时将其 this 指向了这个新的 Object 对象。Point 中的 this.X 和 this.Y 是 Point 类的两个公共成员,所以 Point 的对象可以直接对它们进行访问。
说到类成员或对象的成员,免不了要提到可访问性的问题。在 javascript 的类中,也有 public 成员和 private 成员之分,但究其细节却不尽相同。javascript 私有成员也是些在类外部不可以通过对象进行操作的成员,其实在类的内部成员之间私有成员也不定能被访问。在类的内部一般只有私有成员和私有成员之间可以互相的访问,你可以认为其它成员权限不够不能操作这些隐私的东西,但如果你有特权,那就不一样了,管它私有公开照用不误。私有成员变量和普通变量声明一样,用 var 关键字,私有方法可以用 var 声明变量来接收方法对象,也可以像普通方法那样去构建。
- functionLady() {
- var age = 30;
- varname ="菜花";
- varthink =function() {
- alert("其实我今年" + age + "岁。");
- };
- functionfancy(){
- alert("幻想变成20岁。");
- };
this.Introduce =function() {
alert("我叫" + name + " , 今年20岁。");
};
};
var younglady = new Lady();
alert(younglady.age); //结果undefined
younglady.think(); //不支持
younglady.fancy(); //不支持
上面是一个 Lady 类,age、think、fancy 都是私有成员,think 和 fancy 方法可以访问 age 和 name,think 和 fancy 两个方法也可以互相进行调用。但它们是私有的,所以创建出来的 youngLady 对象并不能调用到 age、think 和 fancy,当然也不能调用到 name。如果私有成员只能互相之间调用,其实也就失去了私有成员存在的意义。javascript 提供特权成员可以建立外界和私有成员互通的桥梁。特权成员是公共成员的一种,公共成员有普通公共成员、特权成员和对象公共成员。
特权成员就是在类中用 this.XX 的方式建立的成员,它们可以通过对象来被调用,它们也可以访问私有成员,可以建立私有成员被访问的通道。
functionLady() {
var age = 30;
this.Name ="菜花";
varthink =function() {
alert("其实我今年" + age + "岁。");
};
functionfancy() {
alert("幻想变成20岁。");
};
this.Introduce =function() {
alert("我叫" + this.Name + " , 今年" + age + "岁。");
};
};
var younglady = new Lady();
younglady.Introduce(); //Introduce
普通公共成员的创建,不在类的里面来编码,而是通过类的 prototype 来创建。添加普通公共成员都直接添加到类的 prototype 中,而 prototype 就是一个像 JSON 对象一样的成员集对象。当我们进行对象创建时,可以认为会将类 prototype 中的成员整体 copy 入新的 Object 对象中。
varyounglady =newLady();
younglady.Introduce(); //Introduce
Lady.prototype.Hobby = "上网";
Lady.prototype.GetName =function() {
return this.Name;
};
varlady2 =newLady();
alert(lady2.GetName());
alert(lady2.Hobby);
上面代码通过 prototype 为 Lady 类添加了普通公共成员 GetName 方法和 Hobby 属性,因为是公共成员,所以它们可以和原先定意在类中的特权成员进行互相访问。因为公共成员可以互相访问。对上述代码做些修改。如下。
varyounglady =newLady();
Lady.prototype.Hobby ="上网";
Lady.prototype.GetName = function() {
return this.Name;
};
alert(younglady.GetName());
alert(younglady.Hobby);
先创建出 Lady 对象,再修改类成员,先前创建好的对象也具有了新的成员。这就是 prototype 做为类原型所带来的好处,这里简单理解,可以认为 prototype 是类对象的模版,模版的修改会影响到所有该类对象。
在添加普通成员的时候也可以来个批量的添加,直接用一个新的 JSON 对象来赋给 prototype 就可以了。但是要注意,现在是将原先的 prototype 进行了替换,在替换之前创建的对象引用的是旧的 prototype 对象,所以对 prototype 替换之前创建的对象不会有 Hobby 和 GetName 成员。
Lady.prototype = {
Hobby: "上网",
GetName:function() {
return this.Name;
}
};
varyounglady =newLady();
alert(younglady.GetName());
alert(younglady.Hobby);
除了在构建类时可以添加公共成员,还可以对对象直接进行成员操作。这在本小系列第二篇文章里有描述。这里做一下补充,对对象直接添加的成员,也是一种公共成员,这些成员也可以和类中原先具有的公共成员进行访问。
younglady.SetName =function(name) {
this.Name = name;
};
younglady.SetName("菜明");
alert(younglady.GetName());
以上说了一下类成员的东西,下次再说说类继承相关的东西。(如有不当说法请指正)
来源: http://www.phperz.com/article/17/0424/286626.html