Contents
  1. 1. 1.面向对象(OPP)
  2. 2. 2.如何创建一个对象

1.面向对象(OPP)

抽象:

封装:只能通过对象来访问方法

继承:从已有对象上继承出新的对象

多态:多对象的不同形态

对象的组成:

1.属性:对象下面的变量叫做对象的属性

2.方法:对象下面的函数叫做对象的方法

2.如何创建一个对象

使用Object函数或者对象字面量都可以创建面向对象,但需要创建多个对象时,会产生大量的重复代码,可通过工厂方式

工厂方式 ——————– 面向对象中的封装函数

复制代码;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//工厂方式 : 封装函数

function createPerson(name){
var obj = new Object();
obj.name = name;
obj.showName = function(){
alert( this.name );
};

return obj;
}

var p1 = createPerson('小明');
p1.showName();
var p2 = createPerson('小强');
p2.showName();

复制代码;)

创建对象用工厂方式来实现,可以传递参数,由于创建对象都是使用Object的原生构造函数来实现的,因此无法识别对象类型

构造函数模式 ——————– 给一个对象添加方法

复制代码;)

1
2
3
4
5
6
7
8
9
10
11
//new 后面调用的函数叫构造函数
function CreatePerson(name){
this.name=name;
this.showName=function(){
alert(this.name);
}
}
var p1=new CreatePerson('小明');//当new去调用一个函数时,函数中的this就是创建出来的对象而函数中的返回值就是this
p1.showName();
var p2=new CreatePerson('小强');
p2.showName();

复制代码;)

使用自定义的构造函数,定义对象类型的属性和方法,与工厂方式的区别:

  • 没有显式的创建对象
  • 直接将属性和方法赋给this对象
  • 没有return语句

上面例子中:CreatePerson构造函数生成的两个对象p1与p2都是CreatePerson的实例

虽然构造函数解决了上面工厂方式的问题,但是它一样存在缺点,就是在创建对象时,每个对象都有一套自己的方法,每定义一个函数都实例化了一个对象

例如:

复制代码;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function CreatePerson(name){

this.name = name;
this.showName = function(){
alert( this.name );
};

}

var p1 = new CreatePerson('小明');
//p1.showName();
var p2 = new CreatePerson('小强');
//p2.showName();

alert( p1.showName == p2.showName ); //false 它们的值相同,地址不同

复制代码;)

测试例子中的p1.showName与p2.showName是否会相等,弹出的结果是false,说明p1和p2实例都包含一个不同的showName实例

原型模式(prototype) ——————– 给一类对象添加方法

原型(prototype)重写对象下面的公用的属性或方法,让公用的属性或方法在内存中存在一份(提高性能),也就是说所有在原型对象中创建的属性或方法都直接被所有对象实例共享。

1
2
3
4
5
6
7
8
9
10
11
   function CreatePerson(name,age){ 
this.name=name;
this.age=age;
}
// 我们把公有的方法放到函数的原型链上
CreatePerson.prototype.showName = function(){
console.log('我的名字是:'+this.name)
}
var person1 = new CreatePerson('小明',25)
var person2 = new CreatePerson('小华',24)
person1.showName() //小明

原型模式的关键:

1).每个函数数据类型上,都有一个属性叫prototype

2).prototype这个对象上,天生自带一个属性,叫constructor:指向当前这个类;

3)每个对象数据类型(普通对象,prototype,实例)上都有一个属性,
叫做proto:指向当前实例所属类的原型;

单例模式(命名空间)

我们把描述同一事物的方法或属性放到同一对象里,不同事物之间的方法或者属性名相同相互也不会发生冲突。

单例模式的优劣:

1.使用单利模式,我们可以实现简单的模块化开发

​ 1.1 避免了全局变量的污染。需要注意的是,我们在引入各个模块的时候,需要注意引入的顺序,引入顺序是按照各模块之间的相互依赖进行前后排列的;

​ 1.2 缺点

  • 单例模式只是一定程度上避免了变量名的冲突,但并不能彻底解决此问题,而且在不同的对象下,我们可能会有很多功能相同的代码,最终造成大量的冗余代码。
  • 单例模式让每个对象有了自己独立的命名空间,但是并不能批量生产的问题,每一个新的对象都要重新写一份一模一样的代码。

面向对象.png

Contents
  1. 1. 1.面向对象(OPP)
  2. 2. 2.如何创建一个对象