深入解析 Javascript 面向对象编程

发布时间:2020-03-04编辑:脚本学堂
本文详细介绍了javascript 面向对象的相关内容,从原理到实例,有需要的朋友参考下吧。
类的修改
1、prototype详解
2、给已有类添加新方法
3、重新定义类的方法
4、超级后置绑定

prototype是Function对象的一个属性,当我们访问对象的一个成员时,先在对象内部找,如果找不到,则到对象所在类的prototype对象中找。

封装
封装:封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
javascript中,通过闭包可以实现封装,看代码例子。
涵盖了javascript公有成员定义、私有成员定义、特权方法定义的简单示例!
 

复制代码 代码示例:

<script>
//定义一个javascript类
function JsClass(privateParam/* */,publicParam){//构造函数
var priMember = privateParam; //私有变量
this.pubMember = publicParam; //公共变量
//定义私有方法
function priMethod(){
return "priMethod()";
}
//定义特权方法
//特权方法可以访问所有成员
this.privilegedMethod = function(){
var str = "这是特权方法,我调用了n";
str += " 私有变量:" + priMember +"n";
str += " 私有方法:" + priMethod() +"n";
str += " 公共变量:" + this.pubMember +"n";
str += " 公共方法:" + this.pubMethod();

return str;
}
}
//添加公共方法
//不能调用私有变量和方法
JsClass.prototype.pubMethod = function(){
return "pubMethod()";
}

//使用 JsClass的实例
JsObject = new JsClass("priMember","pubMember");

//alert(JsObject.pubMember);//弹出pubMember信息
//alert(JsObject.priMember);//弹出undefined信息
//alert(JsObject.pubMethod());//弹出pubMethod信息
//alert(JsObject.priMethod());//弹出"对象不支持此属性或方法"的错误
alert(JsObject.privilegedMethod());
</script>

涵盖了javascript公有成员定义、私有成员定义、特权方法定义的简单示例!
 

复制代码 代码示例:

<script>
//定义一个javascript类
function JsClass(privateParam/* */,publicParam){//构造函数
var priMember = privateParam; //私有变量
this.pubMember = publicParam; //公共变量
//定义私有方法
function priMethod(){
return "priMethod()";
}
//定义特权方法
//特权方法可以访问所有成员
this.privilegedMethod = function(){
var str = "这是特权方法,我调用了n";
str += " 私有变量:" + priMember +"n";
str += " 私有方法:" + priMethod() +"n";
str += " 公共变量:" + this.pubMember +"n";
str += " 公共方法:" + this.pubMethod();

return str;
}
}
//添加公共方法
//不能调用私有变量和方法
JsClass.prototype.pubMethod = function(){
return "pubMethod()";
}

//使用 JsClass的实例
JsObject = new JsClass("priMember","pubMember");

//alert(JsObject.pubMember);//弹出pubMember信息
//alert(JsObject.priMember);//弹出undefined信息
//alert(JsObject.pubMethod());//弹出pubMethod信息
//alert(JsObject.priMethod());//弹出"对象不支持此属性或方法"的错误
alert(JsObject.privilegedMethod());
</script>

继承
面向对象编程 (OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
1、对象冒充
2、call及apply
3、原型链
4、混合方式

继承-对象冒充
 

复制代码 代码示例:
function classA(name) {
this.name=name;
this.showName=function(){alert(this.name);}
}
function classB(name) {
this.newMethod = classA;
this.newMethod(name);
}
obj = new classA("hero");
objB = new classB("dby");
obj.showName(); // print hero
objB.showName(); // print dby 说明classB 继承了classA的方法.
 

对象冒充可以实现多重继承 例如
 

复制代码 代码示例:
function classz(){
this.newMethod = classX;
this.newMethod();
delete this.newMethod;
}

但是如果classX和classY有相同的属性或者方法,classY具有高优先级.

继承-call方法
call方法使与经典的对象冒充法就相近的方法,它的第一个参数用作this的对象,其他参数都直接传递给函数自身.
 

复制代码 代码示例:
function sayName(perfix) {
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.call(obj,"hello," );
function classA(name) {
this.name=name;
this.showName=function(){alert(this.name);};
}
function classB(name) {
classA.call(this,name);
}
objB = new classB("bing");
objB.showName();////说明classB继承classA的showName方法

继承-apply方法
aplly()方法有2个参数,一个用作this对象,一个使传递给函数的参数数组.
 

复制代码 代码示例:
function sayName(perfix) {
alert(perfix+this.name);
}
obj= new Object();
obj.name="hero";
sayName.aplly(obj,new Array("hello,") );

继承-原型链
prototype对象的任何属性和方法都会被传递给对应类的所有实例,原型链就是用这种方式来显现继承.
 

复制代码 代码示例:
function classA (){}
classA.prototype.name="hero";
classA.prototype.showName=function(){alert(this.name)}
function classB(){}
classB.prototype=new classA();
objb = new classB()
objb.showName();//print hero 说明b继承了a的方法
 

这里需要注意 调用classA的构造函数时,没有给它传递参数,这是原型链的标准做法,确保函数的构造函数没有任何参数.
并且 子类的所有属性和方法,必须出现在prototype属性被赋值后,应为在它之前赋的值会被删除.因为对象的prototype属性被替换成了新对象,添加了新方法的原始对象将被销毁.

继承-混和方式
就是用冒充方式 定义构造函数属性,用原型法定义对象方法.
 

复制代码 代码示例:
function classA(name) {
this.name=name;
}
classA.prototype.showName=function(){alert(this.name)}
function classB(name) {
classA.call(this,name);
}
classB.prototype = new classA();
classB.prototype.showName1=function(){alert(this.name+"*****");};
obj = new classB("hero");
obj.showName();
obj.showName1();

在classB的构造函数中通过调用call方法 继承classA中的name属性,用原型链来继承classA的showName方法.

javascript中的方法重载探讨
方法重载(overloading)及覆盖(overriding)
Javascript 中的方法本身就是一个带可变参数的,不支持重载操作。但我们可以在方法体内自由检测方法的参数情况,来实现重载的效果。(使用可变参数或arguments 来模拟重载的示例)。

覆盖,也称为改写,就是指子类中定义的方法替换掉父类的方法

javascript中多态性(polymorphisn)探讨
多态性(polymorphisn):是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
var a=[a1,a2,a3];

您可能感兴趣的文章:
JavaScript面向对象编程(入门参考)
理解JavaScript中的面向对象
JavaScript 面向对象的原型与实例分析
JavaScript面向对象的一个例子
JavaScript 面向对象(OOP)的语法参考
javascript面向对象之this用法举例
javascript面向对象编程之this详解
javascipt面向对象扩展的例子
javascipt面向对象之成员函数实例
javasrcipt 面向对象编程的例子