面向对象编程

面向对象是将程序和数据封装其中

面向对象的三大特征:抽象,继承,多态。

抽象:

对事物的大概描述

继承:

继承性是子类自动共享父类数据结构和方法的机制。在定义和实现一个类的时候,在已存在的类的基础之上来进行,把已存在的内容作为自己的内容,在加如新的内容。

多态:

不同的对象,收到同意消息可以产生不同的结果。

类与对象

是个抽象,和某个具体事物的属性,和方法相同的对象。

类的实例是对象

对象把数据及对数据的操作方法放在一起

 

对象的抽象是类

类与对象的关系: 模板 -》 产品

有事物均继承自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
 
 
面向对象与面向过程的区别
 
面向过程是一种直接的的编程方法,它是按照编程的思路考虑问题,通过顺序执行一组语句来实现一个功能。
 
面向过程可以说是从细节方面考虑问题
面向对象可以说是从宏观方面考虑问题
 
面向过程  ==>  ‘自己造电脑'
面向对象  ==>  ‘自己组装电脑’
 
 

 

posted @ 2021-03-03 23:06  不想飞的小鸟  阅读(63)  评论(0编辑  收藏  举报