局部变量和局部函数
无论是ES6之前还是ES6, 只要定义一个函数就会开启一个新的作用域
只要在这个新的作用域中, 通过let/var定义的变量就是局部变量
只要在这个新的作用域中, 定义的函数就是局部函数
对象的私有变量和函数
默认情况下对象中的属性和方法都是公有的, 只要拿到对象就能操作对象的属性和方法
外界不能直接访问的变量和函数就是私有变量和是有函数
构造函数的本质也是一个函数, 所以也会开启一个新的作用域, 所以在构造函数中定义
的变量和函数就是私有和函数
什么是封装?
封装性就是隐藏实现细节,仅对外公开接口
为什么要封装?
- 不封装的缺点:当一个类把自己的成员变量暴露给外部的时候,那么该类就失去对属
性的管理权,别人可以任意的修改你的属性 - 封装就是将数据隐藏起来,只能用此类的方法才可以读取或者设置数据,不可被外部任
意修改. 封装是面向对象设计本质(将变化隔离)。这样降低了数据被误用的可能
(提高安全性和灵活性)
function Person() {
this.name = '踩墟捆';
// this.age = 12;
let age = 12; // 创建私有属性
this.setAge = function (myAge) { // 私有函数
if(myAge >= 0){
age = myAge;
}
}
this.getAge = function () { // 私有函数
return age;
}
this.say = function () {
console.log("hello world");
}
/*
// 由于构造函数也是一个函数, 所以也会开启一个新的作用域
// 所以在构造函数中通过var/let定义的变量也是局部变量
// 所以在构造函数中定义的函数也是局部函数
var num = 123;
let value = 456;
function test() {
console.log("test");
}
*/
}
let obj = new Person();
// 结论: 默认情况下对象的属性和方法都是公开的, 只要拿到对象就可以操作对象的属性和方法
// console.log(obj.name);
// obj.age = -3;
// console.log(obj.age);
// obj.say();
// console.log(age);
obj.setAge(-3); // 12
console.log(obj.getAge());
私有属性注意点
- 在给一个对象不存在的属性设置值的时候, 不会去原型对象中查找, 如果当前对象没有就会给当前对象新增一个不存在的属性
- 由于私有属性的本质就是一个局部变量, 并不是真正的属性, 所以如果通过 对象.xxx 的方式是找不到私有属性的, 所以会给当前对象新增一个不存在的属性
function Person() {
this.name = '踩墟捆';
let age = 34;
this.setAge = function (myAge) {
if (myAge >= 0) {
age = myAge;
}
}
this.getAge = function () {
return age;
}
this.say = function () {
console.log('Hi');
}
}
let obj = new Person();
// 操作的是私有属性(局部变量)
obj.setAge(-3);
console.log(obj.getAge()); // 34
// 操作的是公有属性
obj.age = -3;
console.log(obj.age); // -3