面向对象编程具有灵活、代码可复用、高度模块化等特点,容易维护和开发,比起由一系列函数或指令组成的传统的过程式编程.
js的底层,对所有数据的处理,都是以对象形式来进行的,所以,js中所有数据都有两种定义方式:
字面量的方式进行定义
var obj = {
name:'某某'
sex:'男'
age:18;
run:function(){
console.log('一天跑3公里')}
}
使用 new Object() 进行定义
var obj = new Object();
obj.name = "Tom ";
obj.sex = " man";
obj.age = 19;
obj.run = function(){
console.log("一天跑一公里");
}
- 面向过程就是亲力亲为,事无巨细,面面俱到,步步紧跟,有条不紊
- 面向对象就是找一个对象,指挥得结果
- 面向对象将执行者转变成指挥者
- 面向对象不是面向过程的替代,而是面向过程的封装
创建对象的方式
**工厂模式**,使用简单的函数创建对象,为对象添加属性和方法,然后返回对象 function Person(name,sex,age){
var obj = {};
obj.name = name;
obj.sex = sex;
obj.age = age;
obj.run = function(){
console.log("每天坚持跑步");
}
return obj;
}
var person1 = Person("Tom","sex",19);
person1.run(); // 输出结果:每天坚持跑步
优点:
1、 在工厂模式中,用户只需要知道所要生产的具体东西,无须关心具体的创建过程,甚至不需要具体产品类的类名。
2、 在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
缺点:
1、 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
构造函数模式。创建自定义引用类型,可以像创建内置对象实例一样使用new操作符,这种方法的缺点是,构造函数的每个成员都无法复用,每次创建出的对象都只有私有变量和私有方法,不能实现共用
function Person(name,sex,age){
this.name = name;
this.sex = sex;
this.age = age;
this.run = function(){
console.log("每天坚持跑步");
}
}
( new Object())
var person1 = new Person("Tom","man",19);
person1.run();// 每天坚持跑步
构造函数的改进
构造全局的对象
var action = {
run:function(){
console.log("每天坚持跑步");
}
}
//构造函数
funcction(name,sex,age){
this.name = name;
this.sex = sex;
this.age = age;
this.run = action.run;
}
var person1 = new Person("Tom","man",19);
person1.run();
原型模式,使用构造函数的prototype属性来指定共享的属性和方法,即使用构造函数定义实例属性,使用原型定义共享的属性和方法
//构造函数
function Person(name,sex,age){
this.name = name;
this.sex = sex;
this.age = age;
}
//使用原型对象 Object.prototype
Person.prototype.run = function() {
console.log("每天坚持跑步");
}
var person1 = new Person("Tom","man",19);
person1.run();// 每天坚持跑步