一直都在用JavaScript完成一些客户端的功能,每次应用都是到网上现查现用,却从来没有系统的学习一下JavaScript。
有一次企图偷窥一下它的内涵,发现身边一个朋友正捧着一本JavaScript的书在看,忘记叫什么名字了,只记得比《thinking in java》还要厚,当时就放弃了偷窥的念头。
昨天在看关于AJAX的一本书时,正好很大的一部分篇幅是讲JavaScript的。读了读,感觉JavaScript真的好强大。同样是一种面向对象的语言,学习起来有很多和JAVA很相似的地方。
JavaScript中的"类"
在面向对象的思想中,最核心的概念之一就是类。 一个类表示了具有相似性质的一类事物的抽象,通过实例化一个类,可以获得属于该类的一个实例,即对象。
在JavaScript中,最常见的代码如下:
// 具体内容
}
我们叫funcName为一个函数,其实funcName也可以理解成一个类,甚至也可以理解成一个对象。
认识function
我们都知道可以用function关键字定义一个函数,并为每一个函数指定一个函数名,通过函数名来进行调用。在JavaScript解释执行时,函数都是被维护为一个对象,这就是函数对象。
函数对象和其它用户自定义的对象有着本质的区别,它和日期对象(Date),数组对象(Array)等一样,都属于内部对象。这些对象的构造器是有JavaScript本身定义的:通过执行new Date()这样的语句返回一个对象。
函数对象对应的类型是function,同日期对象对应的类型是Date一样,可以通过new function()来创建一个函数对象,也可以通过function关键字来创建一个对象。如:
// 1.有名函数,函数名为func。
// 2.函数名被调用才执行。
}
var func = new function () {
// 1.无名函数,func只是一个变量对象指向了这个函数。
// 2.先初始化函数,也就是执行一次,再把创建的函数对象赋给func。
}
prototype原型对象
prototype是一个对象。
prototype对象是实现面向对象的一个重要机制,所以特别记录一下。
由上面可以看出,每个函数其实也是一个对象,它们对应的类是“function”。这里,JavaScript同Java不同,就是,每一个函数对象都有一个子对象prototype。prototype对象表示该函数的原型,把函数理解成类,也就是说,prototype表示了一个类的组成。
当通过new来获取一个类的对象的时候,prototype对象的成员都会成为实例化对象的成员。如:
}
student.prototype.name = " realsmy " ;
student.prototype.showBlog = function () {
alert(http://www.blogjava.net/realsmy);
}
类的实现
function student() {
// 相当于构造函数
}
// 无类型对象的构造方法来指定prototype对象。
student.prototype = {
// 属性
name:"realsmy";
// 方法
showBlog:function(){
alert(this.name+" :http://www.blogjava.net/realsmy");
// 注意,类的成员之间互相引用,必须通过this指针来进行。
}
}
这样更像传统意义面向对象语言中类的实现,只是构造函数和类的定义被分成了两个部分。
实现private,static
private:
前面的例子都属于共有成员,也就是说,向任何实例公开这些属性和方法。
JavaScript中没有特殊的机制来定义私有成员,但可以通过变量的作用域来实现。
var id = "007";
this.myId = id;
this.showId() = function(){
alert(id); // 可以访问id
alert(this.myId);
}
}
var stu = new student();
// stu.id这个会被认作是未定义的
stu.myId = " 008 " ; // 有效赋值
stu.showId(); // 弹出"007"和"008"
static:
静态成员也是一个类的成员。
因为函数也是一个对象,所以可以用给函数对象直接添加成员的方法来实现静态成员。
}
// 静态属性
student.school = " po da xue " ;
// 静态方法
student.out = function () {
alert("jin tian ni tao ke le ma?");
}
这样每一个student对象都可以调用到那个属性和方法。
或者
function .prototype.show = function () {
//
}
这样是给每个函数对象都添加通用的静态方法。
类的继承
利用反射机制和prototype实现继承
为了方便,可以先为每一个类添加一个共有的方法,用以实现继承。
// 反射机制
for(var p in baseClass.prototype){
this.prototype[p] = baseClass.prototype[p];
}
}
基类
//
}
class1.prototype = {
//
method:function(){}
}
子类
//
}
class2.inherit();
class2.prototype.method = function () {
// 覆盖父类中的method方法。
}
这样的方法是在牺牲了一定的代码可读性为代价的前提下,实现了类的继承。据说现在javascript的一种框架已经更好的实现了类的继承机制,还没有研究过。呵呵。
function是所有函数对象的基础,Object是所有对象(包括函数对象)的基础。
感觉,所有面向对象语言的设计思想都是一致的。简单说就是以对象为基础。JavaScript作为一种面向对象的语言,同样是以对象为基础的。
理解JavaScript面向对象的思想,对我以后学习JavaScript的一些高级技术会有很大帮助。
故,记录笔记于此。