面向对象的Javascript
Javascript是基于对象的,而并非基于类,在Javascript中“一切皆对象”。但是,Javascript的函数式语言的特性使得它本身是可编程的,它可以变成你想要的任何形式。
原型继承
JavaScript 中的继承是通过原型链来实现的,调用对象上的一个方法,由于方法在Javascript对象中是对另一个函数对象的引用,因此解释器会在对象中查找该属性,如果没找到则在其内部对象prototype上搜索。由于prototype对象与对象本身的结构是一样的,因此这个过程会一直回溯到发现该属性,则调用该属性,否则报告一个错误。关于原型继承,看下面这个例子
function base(){
this.baseFunc = function () {
alert("base behavior");
}
}
function middle () {
this.middleFunc = function () {
alert("middle behavior");
}
}
middle.prototype = new base();
function final () {
this.finalFunc = function () }
alert("final behavior");
}
}
final.prototype = new middle();
function test (){
var obj =new final();
obj.baseFunc();
obj.middleFunc();
obj.finalFunc();
}
test ();
在function test中,我们new 了一个final对象,然后一次调用base,middle,final的方法,由于obj对象上并没有此方法。则在原型链上搜索,由于final的原型链上包含middle,middle的原型链上包含base,因此执行这个方法就实现了类的继承。
new 操作符
看个例子
function shape (type){
this.type = type || "rect";
this.calc = function () {
return "calc,"+this.type;
}
}
var triangle = new shape("triangle");
alert("triangle.calc());//calc,triangle
var circle = new shape ("circle");
alert(circle.calc());//calc, circle
在javascript中,通过new操作符来作用于一个函数,实质上会发生这样的动作:
1.首先创建一个空对象。
2.然后调用apply()方法,将这个空对象传入作为apply的第一个参数以及上下文参数。这样函数内部的this将会被这个空对象所替代。
var triangle = new shape('triangle');
//上一句相当于下面的代码
var triangle = {}
shape.apply(triangle,["tirangle"]);