JavaScript面向对象编程核心机制解析:类、继承与多态模拟

作者:闭包旅人时间:2026-10-23 09:19:37浏览:513

本文深入解析JavaScript面向对象编程的核心机制。从类与函数的本质区别入手,详细阐述公有与私有成员的定义方式,利用prototype实现类继承,并通过arguments属性模拟方法重载。同时对比对象字面量定义法,帮助开发者掌握JS中构建复杂对象模型的实用技巧。

JavaScript面向对象基础概述

探讨JavaScript的面向对象设计时,需要认识到该语言本身并不像C++、Java或C#等高级语言那样具备严格的类型约束和语法规范。在深入阅读本篇内容之前,建议读者先具备其他主流面向对象语言的开发经验,并理解面向对象编程的基本概念。


类的定义与调用方式

1. 类的定义:


function ClassName(){


}

观察代码结构可以发现,JavaScript中类的定义语法与函数的定义语法完全一致。


实际上,函数与类的区别仅体现在调用方式上。例如,在页面中分别演示两种用法:


<script language="javascript">


function A(){


alert('hello');


}

//A作为函数来使用


A();



//A作为类来使用,从类A派生出一个obj对象


var obj=new A();


</script>



类的成员:公有与私有

2. 类的成员:


function ClassName(){


//定义公有变量


this.property1=0;


//定义公有方法


this.method1=function(){


//判断this.a是否赋值


if(this.a != undefined)


alert(this.a);


}

//另外一种方法的定义形式


this.method3=funcA;



//定义私有成员


var pram1=1;


var method2=function(){


alert('');


}
}

//funcA是方法method3的处理函数


function funcA(){


alert('');


}

上述代码的具体解释如下:


以this开头的成员均为类的公有(public)成员。


例如:property1是类的属性,method1是类的方法;


类的成员无需使用var关键字定义,未使用this前缀的变量均为私有变量。


例如:pram1是私有变量,method2是私有方法;


类的属性可以在类外部定义,无需在构造函数中初始化。即使未在类内部定义,仍可在外部调用;


例如:在method1中需要输出a属性,但类内部并未定义a属性,我们可以在创建对象时为其赋值。


var obj=new ClassName()


obj.a="hello javascript";


obj.method1();


类的方法可以通过this.method=function(){}来定义,例如method1方法;


也可以通过this.method=funcName来定义,将方法指定由某个现有函数处理,例如method3;



利用Prototype实现类继承

3. 类的继承:


function classA(){


this.property1='hello';


this.method1=function (){


alert(this.property1);


}
}

function classB(){


}

//继承classA


classB.prototype=new classA();



//给classB添加PI属性


classB.prototype.PI=3.1415926;


//给classB添加showPI方法


classB.prototype.showPI=function(){


alert(this.PI);


}

通过prototype对象,将classA的实例赋值给prototype,从而实现classB对classA所有成员的继承;


例如:classB.prototype=new classA();


同时,也可以通过prototype在类外部动态添加成员(这是其他高级语言所不具备的功能);


例如:classB.prototype.PI和classB.prototype.showPI



通过Arguments模拟方法重载

4. 类方法的重载:


类方法的重载在构造函数中较为常见,例如存在两个同名但参数不同或类型不同的方法。JavaScript在形式上不直接支持方法重载,但可以通过arguments属性来实现类似功能:


function classA(){


//获取参数个数


//注意this.arguments.length是错误的


var num=classA.arguments.length;



this.method1=function(){


if(num==0){


alert(0);


}

if(num==1){


alert(1);


}
}
}

类或函数名的arguments属性返回一个包含所有参数的数组;


例如:classA.arguments.length可以获取参数个数,classA.arguments[0]获取第一个参数的值


根据需求,通过判断参数个数或参数值,使同一个函数或类具备不同功能,例如:


var obj= new classA();


obj.method1();//输出了0


var obj1= new classA(5);


obj1.method1();//输出了1



对象的两种定义模式

5. 对象的定义:


//对象是类的实例,定义一个类,作为一个对象的模板


function A(){


this.a=1;


this.b=2;


this.add=function(){


return this.a+this.b;


}
}

//定义一个对象


var obj=new A();


//赋值类属性


obj.a=5;


obj.b=6;


//调用类方法


var sum=obj.add();



另一种定义方法:


var obj={


a:1,


b:2,


add:function(){


return this.a + this.b;


}
}

这种定义对象的方式,将类的结构一并定义,适用于仅需使用一次的类;


定义属性和方法时无需使用this关键字,":"后直接赋值即可


但是在方法内部访问属性时,仍需使用this关键字



本文仅基于个人经验与理解编写,可能与部分书籍内容存在差异。希望读者阅读后能快速掌握相关概念。本文旨在抛砖引玉,具体项目需求需具体分析。文中所有示例均已亲自调试无误,如有错误欢迎指正。

作者最新文章