javascript面向对象

1.Javascript面向对象的概念
(1).一切事物皆对象
(2).对象具有封装和继承特性
(3).对象与对象之间使用消息通信,各自存在信息隐藏
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为
它的语法中没有class(类)
2.基于类的面向对象和基于原型的面向对象方式比较
在基于类的面向对象方式中,对象(object)依靠 类(class)来产生。而在基于原型的面向对象方式中,对象(object)则是依靠 构造器
(constructor)利用 原型(prototype)构造出来的。举个客观世界的例子来说明二种方式认知的差异。例如工厂造一辆车,一方面,工人必须参照一
张工程图纸,设计规定这辆车应该如何制造。这里的工程图纸就好比是语言中的 类 (class),而车就是按照这个 类(class)制造出来的;另一方面,工
人和机器 ( 相当于 constructor) 利用各种零部件如发动机,轮胎,方向盘 ( 相当于 prototype 的各个属性 ) 将汽车构造出来。
3. 面向对象的特点:
封装、继承和多态。这里先详细说明这几个特点,后面几个部分分别在JavaScript中实现这些特点,从而实现完整的面向对象模拟。 ?
封装:封装就是把各种方法和变量合并到一个类,用这个类代表某个对 象为完成一定的任务所能保存的范围以及它能执行的操作。封装隐藏了方法执行
的细节。 ?
继承:继承就是根据现有类的方法和成员变量生成新的类的功能。 ?
多态:多态就是对象随着程序执行而使其形式发生改变的能力
4.基本数据类型:
Number, String, Boolean, Function, Object, Array, null, undefined
注意null和undefined的区别。
5.继承的实现
(1).对象冒充法
<script type="text/javascript" language="javascript">
function classA(sColor){
this.color=sColor;
this.sayColor=function(){
alert(this.color)
}
}
function classB(sColor,sName){
this.method=classA();// ClassA的构造函数成为ClassB的方法
this.method=(sColor); // 使用ClassA的构造函数,ClassB会收到ClassA的构造函数中定义的属性和方法
delete this.method; // 删除ClassA的引用
this.name=sName;
this.sayName=function(){
alert(this.name)
}
}
var obj= new ClassB("blue", "Nicholas");
obj.sayColor();
obj.sayName();
alert(obj instanceof ClassA); // 返回false
alert(obj instanceof ClassB); // 返回true
</script>
以上,ClassA为构造函数,其实也只是一个函数,所以ClassA的构造子数成为了ClassB的一个方法,然后调用该方法,在ClassB中引入了ClassA()构造
函数中定义的属性和方法。最后删除对ClassA的引用。这样一来,相当于ClassA构造函数中定义的属性和方法成为了ClassB中定义的属性及方法。
对于instanceof方法,在使用对象冒充继承时,如果使用instanceof <基类名>是返回false的。所以对象冒出继承是假继承法
冒充方法只适合所有的属性及方法在构造函数中进行定义的类
(2).call()和apply()方法
● call方法与经典的对象冒充方法最相似,它第一个参数用作this的对象,表示需要被继承的对象,其它参数都直接传递给基类构造函数的。
<script type="text/javascript" language="javascript">
function ClassA(sColor) {
this.color = sColor;
this.sayColor = function() { alert(this.color); };
}
function ClassB(sColor, sName) {
//this.newMethod = ClassA;
//this.newMethod(sColor);
//delete this.newMethod;
ClassA.call(this, sColor); // 很简便,一行相当于上面三行。
this.name = sName;
this.sayName = function () { alert(this.name); };
}
// 使用直接定义对象方法。从相应的对象中继承。
function sayColor(sPrefix, sSuffix) {
alert(sPrefix + this.color + sSuffix);
}
var obj = new Object();
obj.color ="red";
sayColor.call(obj, 'The color is ', ', a very nice color indeed.'); // 表示obj对象继承自sayColor.
</script>
● apply方法有两个参数,分别为this对象(即需要被继承的对象)和要传递给基类构造函数参数的数组。例如:
function ClassB(sColor, sName) {
//this.newMethod = ClassA;
//this.newMethod(sColor);
//delete this.newMethod;
ClassA.apply(this, new Array(sColor)); // 与call不同的是,第二个参数是一个参数数组.
this.name = sName;
this.sayName = function () { alert(this.name); };
}
3.原型链继承
<script type="text/javascript">
function ClassA(sColor) {
this.color = sColor;
}
ClassA.prototype.sayColor = function() { alert(this.color); }; // 原型方法
//如果需要继承ClassA中的原型方法,需要在子类中使用以下语句: ClassB.prototype = new ClassA();
function ClassB(sColor, sName) {
ClassA.call(this, sColor); // 继承了ClassA中的构造方法

this.name = sName;
this.sayName = function() { alert(this.name); };
}
ClassB.prototype = new ClassA(); // 继承了ClassB中的原型方法

var objB = new ClassB("blue", "Nicholas");
objB.sayColor();
objB.sayName();
alert(objB instanceof ClassA); // 返回true
alert(objB instanceof ClassB); // 返回true
</script>
一般来说,在Javascript中,继承一个类,对象冒充及原型链方式都会被混合在一起使用。使用对象冒充继承构造函数的属性,使用原型链继承
prototype对象的方法。

posted @ 2015-06-22 12:34  人塰ー粒渣  阅读(107)  评论(0编辑  收藏  举报