什么是封装?
封装性就是隐藏实现细节,仅对外公开接口
为什么要封装?
不封装的缺点:当一个类把自己的成员变量暴露给外部的时候,那么该类就失去对属性的管理权,别人可以任意的修改你的属性
<script>
function Person() {
this.name = "Durant";
this.age = 35;
this.say = function() {
console.log("Hello World");
}
}
let obj1 = new Person();
obj1.age = -3; //属性可以任意修改 及其不安全
console.log(obj1.name);
console.log(obj1.age);
obj1.say();
</script>
结论:默认情况下对象的属性和方法都是公开的, 只要拿到对象就可以操作对象的属性和方法
控制台输出:
封装就是将数据隐藏起来,只能用此类的方法才可以读取或者设置数据,不可被外部任意修改. 封装是面向对象设计本质(将变化隔离)。这样降低了数据被误用的可能 (提高安全性和灵活性)
<script>
function Person() {
this.name = "Durant";
let age = 30; //此时age为局部变量也是私有属性,外界不可以直接访问,只能用此类的方法才可以读取或者设置数据
this.setAge = function(myAge) {
if (myAge >= 0) {
age = myAge;
}
}
this.getAge = function() {
return age;
}
this.say = function() {
console.log("Hello World");
}
}
let obj1 = new Person();
console.log(obj1.name);
obj1.setAge(35);
// obj1.setAge(-3); 满足不了判断条件
console.log(obj1.getAge());
obj1.say();
</script>
控制台输出:
注意点:
在给一个对象不存在的属性设置值的时候, 不会去原型对象中查找, 如果当前对象没有就会给当前对象新增一个不存在的属性
由于私有属性的本质就是一个局部变量, 并不是真正的属性, 所以如果通过 对象.xxx的方式是找不到私有属性的, 所以会给当前对象新增一个不存在的属性
<script>
function Person() {
this.name = "Durant";
let age = 30; //此时age为局部变量也是私有属性,外界不可以直接访问
this.setAge = function(myAge) {
if (myAge >= 0) {
age = myAge;
}
}
this.getAge = function() {
return age;
}
this.say = function() {
console.log("Hello World");
}
}
let obj1 = new Person();
obj1.setAge(35); //操作的是私有属性
console.log(obj1.getAge());
obj1.age = -3; //操作的是公有属性
console.log(obj1.age);
</script>
控制台输出:
在JavaScript中属性和方法分类两类
实例属性/实例方法
在企业开发中通过实例对象访问的属性, 我们就称之为实例属性
在企业开发中通过实例对象调用的方法, 我们就称之为实例方法
静态属性/静态方法
在企业开发中通过构造函数访问的属性, 我们就称之为静态属性
在企业开发中通过构造函数调用的方法, 我们就称之为静态方法
<script>
function Person() {
this.name = "Durant";
this.say = function() {
console.log("Hello World");
}
}
let obj1 = new Person();
console.log(obj1.name); //实例属性
obj1.say(); //实例方法
Person.age = 10;
Person.talk = function() {
console.log("talk");
}
console.log(Person.age); // 静态属性
Person.talk(); //静态方法
</script>
控制台输出: