面向对象编程
如果对 js 的原型,原型链,__proto__不熟悉,可以看我之前对原型,继承,设计模式介绍
1、面向过程的程序中,代码和数据是分离的,好比你请了一个修冰箱的修理工(repair_fridge),结果它是空着手来的,啥都没带,你不仅要给它输入一个冰箱,还要负责给它准备一堆螺丝刀、扳手、线材、备件,等它修完了,你还得负责在合适的时候把这些不用了的东西清理掉。这其中哪一步出问题了都修不成。
2、后来你请了一个面向对象的修理工(FridgeRepairer.repair),他只要求你提供一个坏的冰箱(以及钱),其他的他自己解决:自带工具,自己从备件库里找合适的备件,自己负责替换掉坏的工具等等,完全不需要你操心。这样虽然做的事情完全没有变化,但是在你看来整个过程就简单多了。这就叫做封装。
3、更妙的是,你后来发现修电视、修空调的修理工都遵循相同的接口(Repairer.repair),这样不管修什么,操作都一致了。这就叫做多态。
面向对象编程的特点
- 每一个对象都可以被看作一个用户清晰角色或者责任的小机器
- 有命名空间:一个有着对象所有功能的容器
- 有 class 类:对象属性与方法的定义
- 有 Object:类一个实例
- 有 Property:对象的属性
- 有 Methods:对象的方法
- 有 Constructor:对象的构造函数
- 有 Inheritance:可继承
面向对象的例子
把大象放入冰箱面向对象的解决方法:1、冰箱.开门() 2、冰箱.装进('大象') 3、冰箱.关门()
function Box(data) {
this.data = data;
this.object = '冰箱';
}
Box.prototype.open = function() {
_open(this.object);
};
Box.prototype.close = function() {
_close(this.object);
};
Box.prototype.put = function() {
_put(this.data, this.object);
};
var box = new Box('大象');
box.open();
box.put();
box.close();
面向过程编程
把大象放入冰箱面向过程的解决方法:1、开门('冰箱') 2、装进(冰箱,大象)3、关门(冰箱)
function open(object) {}
function put(object, data) {}
function close(object) {}
命令式编程
var numbers = [1, 2, 3, 4, 5];
var doubled = [];
for (var i = 0; i < numbers.length; i++) {
var newNumber = numbers[i] * 2;
doubled.push(newNumber);
}
console.log(doubled);
// 输出
// [2,4,6,8,10]
var numbers = [1, 2, 3, 4, 5];
var total = 0;
for (var i = 0; i < numbers.length; i++) {
total += numbers[i];
}
console.log(total);
// 输出
// 15
函数式编程(声明式编程)
// 声明式编程
var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map(function(n) {
return n * 2;
});
console.log(doubled);
// 输出
// [2,4,6,8,10]
var numbers = [1, 2, 3, 4, 5];
var total = numbers.reduce(function(sum, n) {
return sum + n;
});
console.log(total);
// 输出
// 15
函数式编程(声明式编程)应用
- 高阶函数(上例中,map,reduce 高阶函数)
- 偏函数:通过制定部分参数来产生一个新定制函数的形式
const isType = function(type) {
return function(obj) {
return toString.call(obj) == '[object ' + type + ']';
};
};
const isString = isType('String');
const isFunction = isType('Function');
console.log(isString('123'));
console.log(isFunction(function() {}));
- 函数柯里化:将多参数函数转成单参数函数
// 柯里化之前
function add(x, y) {
return x + y;
}
add(1, 2); // 3
// 柯里化之后
function add2(y) {
return function(x) {
return x + y;
};
}
add2(2)(1);
函数式编程(声明式编程)特点
- 使用表达式替代语句
- 避免了共享状态
参考
如何通俗易懂地举例说明「面向对象」和「面向过程」有什么区别
函数式编程了解一下(JavaScript 描述)
JavaScript 面向对象简介
确认评论邮箱
邀请制评论