面向对象的基本特征(封装、继承、多态)
31.1 封装:将数据及其和它相关的行为封装
js如何实现函数私有共有
es5能通过闭包来实现,具体参考高程P187
1. 基于es6的新特性:Symbol类型实现私有变量,私有属性
var Pclass = (function () {
const a = Symbol('a');
const m = Symbol('m');
class Pclass {
constructor() {
this[a] = 'a这是私有变量';
this.b = '变量B-外部可访问';
this[m] = function () {
console.log('私有方法');
}
}
getA() {
console.log(this[a]);
}
getM() {
console.log(this[m]);
}
}
return Pclass
}())
let pc = new Pclass()
console.log(pc) //打印 Pclass {b: "变量B-外部可访问", Symbol(a): "这是私有变量", Symbol(m): ƒ}
2. 使用ES6扩展的类型WeakMap类型定义
WeakMap类型是一个键-值(key-val)对的集合,只不过他的键(key)只接受对象作为引用,不同于一般的键-值。WeakMap 的使用如下。
const wm = new WeakMap();
const a = {}, b = {};
wm.set(a, '这是a对象键的值');
wm.set(b, '这是b对象键的值');
console.log(wm.get(a)) //打印 这是a对象键的值
console.log(wm.get(b)) //打印 这是b对象键的值
var Pclass = (function () {
const aa = new WeakMap();
const mt = new WeakMap();
class Pclass {
constructor() {
this.b = 'b这是公有变量';
aa.set(this, '私有变量aa')
mt.set(this, function () {
console.log('私有方法mt')
})
}
getA() {
console.log(aa.get(this));
}
getM() {
console.log(mt.get(this));
}
}
return Pclass
}())
let pc = new Pclass()
console.log(pc) // Pclass {b: "b这是公有变量"}
31.2 继承:JS利用原型实现继承
使用原型链的对象关联实现继承
31.3 多态
父类的通用行为可以被子类用更特殊的行为重写
实现传入参数不同,函数重载
1. 通过 arguments 对象来实现
function overload() {
if (arguments.length === 1) {
console.log('一个参数')
}
if (arguments.length === 2) {
console.log('两个参数')
}
}
overload(1); //一个参数
overload(1, 2); //两个参数