什么是面向对象

                                       什么是对象? 
比如电视机就是一个对象,很具体的一个实例。

什么是面向对象(OOP)?(是一种思想) 
我要看电视,我可以不清楚电视机的内部原理,但我会用电视机表面的功能按键,声音,频道等,并不会影响我使用这个电视对象。

OOP有哪些特点?

抽象抓住关键需要的点(比如员工工资发放系统,只需要知道名字,工号就可以,不需要身高,体重之类的属性)

封装电视机就像个黑盒子,内部的原理电路板什么都不用管,只要会用表面的功能就好啦!比如JQ,会用就行,里面的原理可暂时不管。

继承 父亲有一些功能,儿子继承了这些功能。儿子还可以根据自己的需要有些新的功能和特征。目的是为了最大目的的重用代码。

多重继承 简单的说,就是一个儿子多个爹。比如盒子:能装东西,汽车:能跑。合起来遗传给后代,就是货车。

函数 在对象里面就叫做方法,一个东西。函数跟对象绑在一起的话,就叫做方法了。

变量 在对象里面就叫做属性,一个东西。 变量跟对象绑在一起的时候就叫做变量了。比如变量是女朋友,结婚后就叫做老婆了。同一个东西,只不过从属于我了,是我的女人,就变成了老婆。

   创建一个对象:

       var obj = new Object(); //创建一个空对象
           obj.name = 'haha';
          obj.showName = function(){ 
          alert(obj.name);
          }
       obj.showName();


   缺点:当我们想创建多个面向对象的时候,重复代码过多,需要封装,所以有了下面的方法

这其实就是简单的封装函数,整个过程像工厂的流水线,所以叫工厂方式

缺点:无法识别创建的对象的类型。因为全部都是Object,没有区分度,不像Date、Array等,因此出现了构造函数模式。


  Object对象和其他对象比如Date,Array,RegExp的区别: Date之类的对象,自己都有很多属性和方法,如果平时要实现面向对象,写一些属性和方法的时候,可能会跟原有的对象Date里面的方法属性冲突。Object不同,它几乎没有自己的对象和方法,像白纸,所以创建一个对象的时候,就new Object()

构造函数: 其实是普通的函数,只是它的功能是用来构造对象的函数

function fn(a,b){
    //构建对象的代码块
}

工厂方式:这个函数的工作流程有点像工厂加工产品,所以叫工厂模式。如下

function fn(a,b){
    //创建原料
    var obj = new Object();

    //加工产品
    obj.name = name;
    obj.yongchu = function(){
        alert("obj的用途是XXX")
    }

    //产品出厂
    return obj;
}

var obj = fn("one","eat") //没有new关键字
var obj2 = fn("two","eat")
alert(obj.yongchu == obj2.yongchu) //false功能一样却不相等,同样功能占用了更多的内存,浪费。

工厂方式缺点 
1.没有new。 2.不同对象具有相同方法时,方法却不相等,这就占用了内存

类和对象: 
类就像是模具,按照这个模具生产出来的可以实实在在用的东西就是对象(实例)。举例如下; 
比如:有个零件的模具,模具本身不能用到实际需要的地方,而通过模具生产出来的零件则实实在在的可以用到实际需要的地方去,可以组装零件啊之类。

原型prototype 
原型prototype类似于CSS中的class,给原型prototype设置属性和方法了,则所有调用这个对象原型的元素都有这个属性和方法。

给对象加属性和方法,则类似于CSS中的行间样式加属性和方法。

流行的面向对象编写方式 
构造函数里面写对象的属性。 
原型里面写对象的方法。 
如代码

   function CreatePerson(name,qq){ //构造函数里面写属性,类名CreatePerson首字母大写
        this.name = name;
        this.qq = qq;
    }

    createPerson.prototype.showName = function(){ //原型里面写方法
        alert("我的名字" + this.name);
    }

    createPerson.prototype.showQQ = function(){
        alert("我的QQ" + this.qq);
    }

    var obj = new createPerson("mike","123456");
    obj.showName();
    obj.showQQ();

 构造函数模式
我们要通过这二个方面来改变:1 函数名首字母大写  2 New 关键字调用
function CreatePerson(name){ 
     this.name = name; 
     this.showName = function(){ 
        alert(this.name); 
     } 
  } 
   var p1 =new CreatePerson('haha'); 
    p1.showName();
   var p2 = new CreatePerson('hehe');
    p2.showName();

1首字母大写,是为了区别于普通的函数,构造函数本身就是普通的函数,只是我们专门用它来实现了构造的功能,所以专门起了一个名字叫构造函数,任何函数都可以成为构造函数,这取决于你调用函数的方式。是否用了New。

2 调用函数的时候用了 New关键字,那么New到底做了什么?用不用New有什么区别?再来看下面的例子

function CreatePerson(name){      this.name = name;    this.showName = function(){      alert(this.name);    };   console.log(this); }  new CreatePerson('haha'); //CreatePerson{} CreatePerson('haha');  //window

我们会发现当用New去调用一个函数的时候,this的指向会不一样。其实New主要做了下面这些事,不过下面写的只是大概的行为,并不是内部源码。

function CreatePerson(name){   
  var res = {};  //声明一个空对象res
   res._proto_= CreatePerson.prototype;//这个对象的_proto_属性指向构造函数的原型对象,这样res       就可以调用CreatePerson原型对象下的所有方法
    CreatePerson.apply(res);//把this指向改为res对象
    this.name = name;  //res对象添加属性,方法
    this.showName = function(){ 
    alert(this.name); 
  };
  return res;//返回这个对象
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值