JavaScript面向对象编程核心概念详解

作者:木棉时间:2026-10-26 19:11:47浏览:584

本文深入解析JavaScript面向对象编程的核心机制。涵盖对象定义、多种创建方式及构造函数原理,详细区分公有、私有、特权与静态成员的实现方法。同时讲解this关键字、call/apply用法及异常处理,为掌握JS原型链与继承奠定基础。

JavaScript对象基础

对象


创建


对象


构造函数


公有、私有、特权、静态成员


this、call和apply


异常处理


继承


原型


对象


在JavaScript中,常言“万物皆对象”,那么究竟什么是对象?简单来说,对象是包含一组变量和函数的集合。与其他面向对象语言不同,JavaScript并非基于类的实例化,而是基于原型的面向对象语言,不存在类的概念,对象是从现有对象的副本中派生而来的。JavaScript中的对象主要可分为Function和Object两大类。



创建对象

对象的创建与构造函数

为了提升运行效率,JavaScript提供了内置对象,如Object、Function、Array等,这些内置对象均可通过new关键字进行创建。其中,Function对象又细分为实例和构造函数两类。例如,alert('my name is X')属于Function的实例;而作为构造函数的Function,则必须通过new关键字来实例化。创建对象主要有以下几种语法形式:


代码如下:

 
var obj= new Object();var obj={};(Array等类似)
var myFunction=new Function(){//代码};function myFunction(){//代码}

需要注意的是,第一种Function声明方式必须在使用之前定义,而第二种方式则允许在使用之后定义。



构造函数

Function是构造函数的起点,创建构造函数的方法与上述创建对象Function的方式类似。


代码如下:

 
var myFunction=new Function('a',/*代码*/)
function myFunction(a){
/*代码*/
} 

但由于第一种方式存在性能问题,推荐使用第二种方式。Function对象的一个显著特点是:它的实例同样可以作为构造函数使用。



静态成员

静态成员与公有成员

如下代码:


代码如下:

 
var myObj= new Object();
//添加name属性
myObj.name='LD';
//添加alertName方法
myObj.alertName=function(){
alert(this.name);
} 
//执行alertName
myObj.alertName();

name和alertName仅存在于myObj实例中,并不存在于构造函数本身。这一点比较容易理解,但对于既可以是构造函数也可以是实例的Function来说,理解起来就不那么直观了。如下:


代码如下:

 
var myConstructor=new function(){
//添加静态属性
myConstructor.name='LD';
//添加静态方法
myConstructor.alertName=function(){
alert(this.nam);
} 
} 
myConstructor.alertName();

代码可以正常运行,因为myConstructor本身也是一个实例,但是name和alertName不会应用到由myConstructor创建的任何新实例中。



公有成员

能够跟随对象实例化的成员称为公有成员。要成为公有成员,需要修改函数的原型,即prototype。公有方法可以随构造函数被继承下去,方法如下:


代码如下:

 
function myConstructor(){
} 
//添加公有属性
myConstructor.prototype.myName='LD';
//实例化
var myObj=new myConstructor();
alert(myObj.myName);

由myConstructor实例化的对象可以使用myName,但是myConstructor本身不可以,因为我们将公有成员添加到了myConstructor的底层定义(原型)中,而非myConstructor实例本身。


私有成员与特权方法

私有成员


私有成员指的是在构造函数内部定义的变量和方法,与其他语言中用private定义类似。例如:


代码如下:

 
function myConstructor(){
//添加私有属性
var myName='Ld'l
//添加私有方法
var alertName=function(){
alert('LD');
} 
alertName();


特权成员

特权方法指的是可以被公开访问,同时其能访问私有成员。在构造函数作用域中使用this定义的方法,类似于其他语言中的公有方法,如下:


代码如下:

 
function myConstructor(){
//私有属性
var sex='male';
// 特权方法
this.alertSex=function(){
alert(sex);
} 
} 


对象字面量

前面我们使用的创建方式都是点语法,例如myConstructor.name=x;myConstructor.sex=x。我们也可以使用对象字面量来达到相同的目的,例如:


代码如下:

 
function myConstructor(){
} 
//添加公有成员
myConstructor.prototype={
name:'LD',
sex:'male',
method:function(){}
} 

注意,对象字面量中分隔符为逗号,且最后一个属性或方法后没有逗号,以防解析错误。


this、call与apply机制

this、call和apply


this是一个依赖于执行环境的关键字,与创建位置无关。this关键字指向的是使用包含它的函数的对象。学过C++和其他语言的人来说,这个概念不难理解。


call和apply的作用是将方法强制附加到某个对象上。例如:


代码如下:

 
//alertName是已经创建好的函数
//alertName不需要参数时
alertName.call('对象')
//alertName需要参数时
alertName.call('对象',‘参数1','参数2')
//alertName使用参数数组时
alertName.applay('对象',‘参数数组arguments')


异常处理

异常处理与总结

和C#类似,由try、catch组成,如下:


代码如下:

 
function myFunction(){
window.style.color='red';
} 
try{
myFunction();
} 
catch{
alert('异常信息:'+exception.name + exception.message)
} 

继承和原型涉及内容较多,将放到下一篇博客《JavaScript中的继承和原型》中详细讲解。

作者最新文章