前言
js主要的三大编程方式:过程化编程,函数式编程,面向对象编程,好的面向对象编程,也可以理解为好的类的设计模式,提高代码可维护性和健壮性。
封装
定义:
当你需要隐藏一些属性和方法时,就可以将这些属性和方法封装起来,然后通过一个外部可以调用的特定接口(也可以说是一个公共的方法)进行调用。
function Person(name, age, sex) {
this.name = name; //共有变量
var age = age; //私有变量
var sex = sex; //私有变量
this.show = function() {
console.log(age + '岁,性别' + sex);
};
}
var person = new Person('小米', 18, '女');
console.log(person.name); // Sunshine
console.log(person.age); // undefined
person.show(); // 18====女
可以看到,在构造函数中this是共用变量,外部可以访问,var是私有变量,外部不能访问,就达到了我们封装的需要了。
继承
定义:
当多个方法存在相同的属性和方法时,就把这些相同的属性和方法提取到一个公共的方法中,通过原型prototype继承该方法,当然你也可以通过call或apply来继承该方法中的属性和方法。
子类去继承父类的方法:
function Parent(name, age, sex) {
this.name = name;
this.age = age;
}
Parent.prototype.show = function() {
console.log(this.age + '岁,性别' + this.sex);
};
function Child(name, age, sex) {
this.sex = sex;
Parent.call(this, name, age);
}
Child.prototype = new Parent();
var child = new Child('小米', 18, '女');
child.show(); // 18岁,性别女
可以看到我们这里用 Parent.call(this, name, age)继承了父类构造函数里面属性;Child.prototype = new Parent()去继承父类构造函数的方法;
ps:有同学好奇了,为什么还要prototype去做继承,好晕啊。原因就是如果用call,每一次new就执行一遍父类里面的方法,造成内存浪费,性能下降。
常见面试题:object.create的原理?
function createObj(o) {
function F(){}
F.prototype = o;
return new F();
}
js继承大全,请看我写的另一篇文章:js继承的方式:精选篇
多态
定义:
同一个实现接口,使用不同的实例而执行不同的操作。
将做什么
、谁去做
、怎样做
分开。
出题:有一群动物,我对猫狗发出叫的命令,发出什么声音?
非多态方式实现
var makeSound = function(animal) {
if (animal instanceof Cat) {
console.log('喵');
} else if (animal instanceof Dog) {
console.log('汪');
}
};
var Cat = function() {};
var Dog = function() {};
makeSound(new Cat());
makeSound(new Dog());
多态方式实现
var makeSound = function(animal) {
animal.sound();
};
var Cat = function() {};
Cat.prototype.sound = function() {
console.log('喵');
};
var Dog = function() {};
Dog.prototype.sound = function() {
console.log('汪');
};
makeSound(new Cat());
makeSound(new Dog());
我想很多同学很好奇,到底啥时候用它?
不知大家有没有听过23种设计模式与6种设计规则。其中策略模式与状态模式就是多态的思想。
我想告诉大家的是,如果一个前端只做前端,不学习node后端思想,那么就是青春饭,长远不了,想晋升,就需要有全栈的思想。话不多说,举个例子。
我想每个人都打过游戏吧,比如有几种状态,减速,加速,眩晕,冰冻,中毒。
当你被减速了,减速效果90%,减速时间2s,此时获得队友加速技能,加速50%,加速时间3s。用if else如何实现,想必大家有了答案,挺复杂的。
当你受了几种状态叠加,各种情况,你得使用排列组合了,而且日后因为用户反馈,有些技能大强大,得优化,就各种改动,你将无法维护这个判断条件。
此时状态模式就诞生了,他要把每一种状态都单独封装起来,通过一个委托函数去处理各种情况,这使得你的条理清晰,极大提高了可维护性和编码性。
如何编写设计模式,这里就不在讨论范围,日后我会出一个专题就将设计模式。
网友评论