JavaScript面向对象:公有、私有、静态与特权方法详解
本文详细解析JavaScript面向对象编程中的四种核心方法:公有、私有、静态及特权方法。通过构造函数与原型链的对比,阐明各自的定义方式、访问权限及调用规则。重点说明公有方法需实例化后通过this访问,私有方法仅限内部调用,静态方法无需实例化且无法访问实例成员,以及特权方法如何结合两者特性实现安全的数据封装与访问。
JavaScript面向对象基础
当前JavaScript在Web开发中占据核心地位,是网站开发人员必须掌握的技能。然而,随着jQuery等框架的普及,许多开发者习惯于函数式编程风格,对闭包、原型机制理解不深,导致在使用JavaScript面向对象特性时显得生疏。要深入掌握JavaScript面向对象编程,首先需要厘清公有方法、特权方法和静态方法的概念与区别。
接下来将分步骤详细解析各类方法的定义与使用。
公有属性和公有方法
首先介绍公有属性和公有方法。
function User(name,age){
this.name = name;//公有属性
this.age = age;
}
User.prototype.getName = function(){//公有方法
return this.name;
}
var user = new User('fire子海',26);
console.log(user.getName());//output:fire子海
私有属性和方法
其次探讨私有属性和私有方法的实现机制。
function User(name,age){
var name = name;//私有属性
var age = age;
function alertAge(){//私有方法
alert(age);
}
alertAge(age); //弹出26
}
var user = new User('fire子海',26);
静态属性和方法
接着分析静态属性和静态方法的特性。
在PHP中,无需实例化即可调用的方法称为静态方法,JavaScript同样具备这一特性。在JS中,无需使用new操作符实例化对象,即可直接通过类名调用其静态方法和属性。
function User(){}
User.age = 26;//静态属性
User.myname = 'fire子海';
User.getName =function(){//静态方法
return this.myname;//如果这里使用this.name,返回的将是User,所有改用了myname,
}
console.log(User.getName());//output:fire子海
特权方法
随后介绍特权方法的概念。
function User(name,age){
var name = name;//私有属性
var age = age;
this.getName = function(){ //特权方法
return name;//私有属性和方法不能使用this调用
}
}
var user = new User('fire子海',26);
console.log(user.getName());//output:fire子海
静态类的创建
最后讨论静态类的创建方式。
对于静态方法和静态属性,无需像创建私有方法那样使用闭包或构造函数内部定义。如果读者参考过关于“JS图片轮播制作”的文章,便会了解可以使用字面量方式直接创建静态对象。
var user = {
init:function(name,age){
this.name = name;
this.age = age;
},
getName:function(){
return this.name;
}
}
user.init('fire子海',26);
console.log(user.getName());//output:fire子海
各类方法的调用规则
接下来明确公有方法的调用规则。
调用公有方法前,必须先通过new操作符实例化对象。
在公有方法内部,可以通过this关键字访问公有属性和特权方法。但公有方法无法通过this调用静态方法和属性,必须通过类名本身进行调用。此外,公有方法也不能直接调用私有方法。
function User(){
this.myname = 'fire子海';//公有属性
this.age = 26;
this.do = function(){//特权方法
return this.myname+'学习js';
}
}
User.eat = function(food){
return '晚餐只有'+food;
}
User.prototype.alertAge = function(){
alert(this.age);
}
User.prototype.alertDo = function(){
alert(this.do());//调用特权方法
}
User.prototype.alertEat = function(food){
alert(User.eat(food));//只能通过对象本身调用静态方法
//alert(this.ear(food))这样调用将出错:this.eat is not a function
}
var user = new User();
user.alertAge();//alert:26
user.alertDo();//alert:fire子海学习js
user.alertEat('方便面')//alert:晚餐只有方便面
然后说明静态方法的调用规则。
使用静态方法时,无需实例化对象即可直接调用。需要注意的是,对象实例无法调用类的静态方法,实例只能访问自身的静态属性和方法(若存在)。
function User(){}
User.age = 26;//静态属性
User.myname = 'fire子海';
User.getName =function(){//静态方法
return this.myname;
}
var user = new User();
console.log(user.getName);//TypeError: user.getName is not a function
user.supper = '方便面';
user.eat = function(){
return '晚餐只有'+this.supper;
}
user.eat();//晚餐只有方便面
静态方法内部无法访问公有属性、公有方法、私有方法、私有属性、特权方法以及原型属性。
function User(){
this.myname = 'fire子海';//公有属性
this.age = 26;
this.do = function(){//特权方法
return this.myname+'学习js';
}
}
User.prototype.alertAge = function(){//公共方法,也叫原型方法
alert(this.age);
}
User.prototype.sex = '男';//原型属性
User.getName= function(){//静态方法
return this.myname;
}
User.getAge = function(){
this.alertAge();
}
User.getDo = function(){
return this.do();
}
//console.log(User.getName())//undefined
//console.log(User.getDo());//TypeError: this.do is not a function
//console.log(User.getAge())//TypeError: this.alertAge is not a function
接着解析特权方法的调用规则。
特权方法可以通过this关键字调用公有方法和公有属性,通过类名本身调用静态方法和属性,并在方法体内直接访问私有属性和私有方法。
function User(girlfriend){
var girlfriend = girlfriend;
function getGirlFriend(){
return '我女朋友'+girlfriend+'是美女!';
}
this.myname = 'fire子海';//公有属性
this.age = 26;
this.do = function(){//特权方法
return this.myname+'学习js';
}
this.alertAge = function(){
this.changeAge();//特权方法调用公有方法
alert(this.age);
}
this.alertGirlFriend = function(){
alert(getGirlFriend());//调用私有方法
}
}
User.prototype.changeAge = function(){
this.age = 29;
}
var user = new User('某某');
user.alertAge();//alert:29
user.alertGirlFriend();//alert:我的女朋友某某是美女!
最后介绍私有方法的特性。
对象的私有方法和属性在外部不可访问。在方法内部,不能使用this关键字调用对象的公有方法、公有属性或特权方法。
function User(girlfriend){
var girlfriend = girlfriend;
this.myname = 'fire子海';//公有属性
this.age = 26;
function getGirlFriend(){
//this.myname ;//此时的this指向的window对象,并非User对象,
// this.myname = 'fire子海',此时的this指向的是getGirFriend对象了。
//如果通过this调用了getGirFriend中不存在的方法呀属性,this便会指向window 对象,只有this调用了getGirlFriend存在的方法和属性,this才会指定getGirlFriend;
alert(User.eat('泡面'));//alert:晚餐只有方便面
}
this.do = function(){//特权方法
return this.myname+'学习js';
}
this.alertAge = function(){
this.changeAge();//特权方法调用公有方法
alert(this.age);
}
this.alertGirlFriend = function(){
getGirlFriend();//调用私有方法
}
}
User.eat = function(supper){
return '晚餐只有'+supper;
}
var user = new User('某某');
user.alertGirlFriend();
以上即为JavaScript中公有、私有、静态及特权方法的完整解析,希望读者能从中受益。
ES6模块化中js文件怎么用import和export交互
2026-11-05 17:00:48
JS读取本地文件时报错或无响应的常见原因
2026-11-05 16:32:31
let、const与var的区别:JavaScript变量声明最佳实践
2026-11-05 14:16:38
JS中直接定义静态二维数组的字面量写法
2026-11-05 14:16:08
JS 怎么查找字符串中所有匹配项的位置
2026-11-05 14:15:53
