面向对象编程 (Object-Oriented Programming,OOP) 是一种编程范式,它将数据和操作数据的方法封装起来,以对象的形式呈现出来,以此来实现代码重用。其中,封装就是OOP中的三大特性之一。
封装(Encapsulation),顾名思义就是封住某些操作,不让外界直接访问内部的数据,只允许一些公共的接口对数据进行访问和操作,从而达到保护数据的目的。常见的封装方式就是利用构造函数、ES5 中的 Object.defineProperty、ES6 中的 class 等方式定义类,并利用各种访问修饰符(public、private、protected 等)来控制成员的访问权限。
在 JavaScript 中,对象通过在构造函数中定义属性和方法,可以轻松地实现封装。下面是一个简单的封装示例:
function Person(name, age) {
this.name = name;
var _age = age;
this.sayHi = function() {
console.log(`Hi, my name is ${this.name}, I'm ${_age} years old.`);
};
this.getAge = function() {
return _age;
};
this.setAge = function(age) {
if (age >= 0 && age <= 120) {
_age = age;
} else {
console.log('Invalid age value.');
}
};
}
var Jack = new Person('Jack', 25);
console.log(Jack.name); // Jack
Jack.sayHi(); // Hi, my name is Jack, I'm 25 years old.
console.log(Jack.getAge()); // 25
Jack.setAge(30);
console.log(Jack.getAge()); // 30
Jack.setAge(-10); // Invalid age value.
console.log(Jack.getAge()); // 30
在上面的示例中,我们定义了一个 Person 的类,类中包含了一个公共的 name 属性,和一个私有的 _age 属性,以及公共的 sayHi 方法和 getAge/setAge 方法。其中,_age 属性被封装在类的构造函数内部,外部无法直接访问,只能通过类提供的公共接口(即 getAge 和 setAge 方法)来操作。
另一个示例是利用 ES6 中的 class 关键字来实现封装:
class Person {
constructor(name, age) {
this.name = name;
var _age = age;
this.sayHi = function() {
console.log(`Hi, my name is ${this.name}, I'm ${_age} years old.`);
};
}
get age() {
return this._age;
}
set age(value) {
if (value >= 0 && value <= 120) {
this._age = value;
} else {
console.log('Invalid age value.');
}
}
}
var Jack = new Person('Jack', 25);
console.log(Jack.name); // Jack
Jack.sayHi(); // Hi, my name is Jack, I'm 25 years old.
console.log(Jack.age); // undefined
Jack.age = 30;
console.log(Jack.age); // 30
Jack.age = -10; // Invalid age value.
console.log(Jack.age); // 30
在上面的示例中,我们同样定义了一个 Person 的类,通过利用 get 和 set 关键字,将私有的 _age 属性暴露成了公共的 age 属性。其中,set 方法通过限制输入值的范围来模拟了私有属性的访问控制。这种方式相较于第一种方式更加简洁,而且语法也更清晰。
总之,对象的封装是面向对象编程必不可少的一部分,它可以保护内部数据的安全,避免外部对数据的直接操作和篡改。同时,良好的封装还可以使代码的重构和维护更加方便,提高了代码的可维护性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript 面向对象编程基础:封装 - Python技术站