面向对象编程
面向对象是将程序和数据封装其中
面向对象的三大特征:抽象,继承,多态。
抽象:
对事物的大概描述
继承:
继承性是子类自动共享父类数据结构和方法的机制。在定义和实现一个类的时候,在已存在的类的基础之上来进行,把已存在的内容作为自己的内容,在加如新的内容。
多态:
不同的对象,收到同意消息可以产生不同的结果。
类与对象
类是个抽象,和某个具体事物的属性,和方法相同的对象。
类的实例是对象
对象把数据及对数据的操作方法放在一起
对象的抽象是类
类与对象的关系: 模板 -》 产品
有事物均继承自Object,都是Object的实例。
变量和属性:
变量是自由的,属性是属于对象的,是与对象相关的值。
函数和方法:
函数是自由的,方法是属于对象的,是与对象相关的函数。
创建对象的方法:
1.Object构造函数 new Object()
2.对象字面量 {}
3.工厂模式
4.构造函数
5.原型模式
6.混合模式
.......
工厂模式
function createObj( n, a ){
// 原料
var obj = {};
// 加工
obj.name = n;
obj.age = a;
obj.sayHi = function (){
alert(‘hi,大家好!我叫’ + obj.name);
}
// 出厂
return obj;
}
var obj1 = createObj(‘小王’, 23);
var obj2 = createObj(‘小李’, 24);
console.log( obj1.sayHi === obj2.sayHi ); // false
console.log( obj1.constructor ); // Object
缺陷:
创造多个对象实例,不同对象的相同方法存在多个。
解决相同方法解决一个
构造函数
当任意一个普通函数用于创建一类对象,并通过new操作符来调用时,它就可以作为构造函数。
作用:构造新对象,设置对象的属性和方法。公用同一个方法
ECMAScript自定义构造函数 构造函数通常以一个大写字母开头
实现:在函数内部给this添加属性和方法,因为this就表示当前运行时的对象
function Human( n, a ){ // 构造函数 类
this.name = n;
this.age = a;
this.sayHi = function (){
alert(‘hi,大家好!我叫’ + this.name);
}
}
var obj1 = new Human(‘张三’, 18);
var obj2 = new Human(‘李四’, 19);
构造函数 => JS内置的工厂模式
function Human( n, a ){ // 构造函数
// var this = {};
this.name = n;
this.age = a;
this.sayHi = function (){
alert(‘hi,大家好!我叫’ + this.name);
}
// return this;
}
var obj1 = new Human();
console.log( obj1 ); // Human{ }
console.log( obj1.sayHi === obj2.sayHi ); // false
console.log( obj1.constructor ); // Human
构造函数的缺陷:
解决了对象类型识别的问题,但是创建多个对象时,不同对象的相同方法仍然存在多个!
原型模式
每个函数都有一个prototype(原型)属性,这个属性指向一个对象,即原型对象
prototype的作用是:所有添加到prototype中的属性和方法都将被所有对象实例共享。
function Cat(){ };
Cat.prototype.name =‘小白’;
Cat.prototype.color =‘white’;
Cat.prototype.food =‘fish’;
Cat.prototype.skill = function (){
alert(‘卖萌~喵喵喵~~~’);
};
var cat1 = new Cat();//实例
var cat2 = new Cat();//实例
alert(cat1.skill === cat2.skill);//true
alert(cat1.name === cat2.name);//true
原型模式的问题:
原型模式省略了为构造函数传递参数这一环节,结果所有实例都将取得相同的属性值。
prototype中的属性和方法共享,对于函数来说非常适合,但属性共享问题就严重了!
混合模式
混合使用构造函数模式和原型模式,是目前JS中使用最广泛、认同度最高的一种创建对象的方法
构造函数模式用于定义实例属性,原型模式用于定义共享的属性和方法
即可以共享方法,又可以向构造函数传递参数,集两种模式之长!
function Person(n,s,a){
this.name = n;
this.sex = s;
this.age = a;
}
Person.prototype.attr = '人类';
Person.prototype.eat = function (){
alert('什么都吃');
}
var p1 = new Person('老王','男',36);
var p2 = new Person('小宋','女',26);
console.log(p1.constructor);//Person
console.log(p1.eat === p2.eat);//true
面向对象与面向过程的区别
面向过程是一种直接的的编程方法,它是按照编程的思路考虑问题,通过顺序执行一组语句来实现一个功能。
面向过程可以说是从细节方面考虑问题
面向对象可以说是从宏观方面考虑问题
面向过程 ==> ‘自己造电脑'
面向对象 ==> ‘自己组装电脑’