面向对象和面向过程

面向对象编程和面向过程编程

共同点:都是解决问题的一种思路;
区别:面向过程关注的是解决问题需要的一个个的步骤(细节).
面向对象关注是解决问题所需要的对象

什么是对象?

万物皆对象,一般对象是指具体的事物。面向对象和面向过程一样,都是解决问题的思路,无优劣之分,但是面向对象更加方便,代码的结构性更好,更方便维护,代码的复用性更好。

  • 现实中的对象:
    1.对象的静态的描述信息:

张三(姓名,性别,身高,体重,头发的颜色..)
张三家的狗(姓名,性别,品种...)

  1. 对象的动态的行为:

张三(吃饭,睡觉,打游戏,谈恋爱,打呼噜..)
张三家的狗(吃饭,睡,咬人,流口水...)

  • 现实中的对象和JS中的对象的关系

对象的静态的描述信息--->对象的属性(定义在对象中的变量)
对象的动态的行为------->对象的方法(定义在对象中的函数)

面向对象的三大特性
  • 封装:JS中使用对象封装一些变量和函数;
    优点:信息隐蔽,代码复用性好,更方便维护。
var name = '战狼2';
var actors = ['吴京',‘张翰’,‘达康书记’,‘弗兰克’]
var  type = '动作片'
var showTime = '2017-7-28'
var  play = function (){
console.log('play');
}
var film = {
   name : '战狼2',
   actors :['吴京',‘张翰’,‘达康书记’,‘弗兰克’],
   type :'动作片',
   showTime : '2017-7-28',
   play = function (){
   console.log('play');
     }
}
  • 继承:
    生活中的继承:一个人获取另一个人的财富或者资源的一种方法。
    程序中的继承:一个类获取另一个类属性或者方法的一种方式。
    面向对象的特点:有没有类(Java c++ oc)
    Js 没有类,支持面向对象的语言,基于对象的语言。
  • 多态:polymorphism = poly(复数) + morph(形态) + ism
    多用于强类型语言中,JavaScript具备与生俱来的多态特性。
    表现:1. 对同一个操作,不同对象有不同的反应;
    2. 隐蔽不同

对象的创建:

  1. 字面量的方式创建对象(key-value):
    场合:只需要创建少量的对象。
    问题:1. 创建的对象无法复用;
    2. 有大量的重复代码(代码的冗余度太高)。
 var stu1 = {
        name : '张三',
        num : 1001,
        className : '如何成为科学家',
        study : function () {
            console.log('我的名字是' + this.name);
        }
    };

    var stu2 = {
        name : '宝宝',
        num : 1190,
        className : '葵花宝典班',
        study : function () {
            console.log('我的名字是' + this.name);
        }
    };

    var stu3 = {
       name : '瓜皮',
       num : '2345',
       className : '三分钟精通JS',
        study : function () {
            console.log('我的名字是' + this.name);
        }
    };
  1. 通过内置的构造函数:
    问题:内置的构造函数和字面量的方式存在一样的问题
    1.创建的对象无法复用
    2.创建多个同类型的对象时,有大量重复的代码,代码的冗余度太高

Object | Array | Function | Date
String | Number | Boolean

//1.创建对象
var obj = new Object();// var obj = {};
//2. 利用对象的动态特性设置属性和方法
  obj.name = 'zs';
   obj.num = 1001;
   obj.className = '暴雨梨花针班';
   obj.study = function () {
       console.log(this.name + this.className);
   }

   var obj1 = new Object();
   obj.name = 'ls';
   obj.num = 2001;
   obj.className = '葵花宝典班';
   obj.study = function () {
       console.log(this.name + this.className);
   }

   var obj2 = new Object();
   obj.name = '老王';
   obj.num = 3001;
   obj.className = '三分钟精通C++';
   obj.study = function () {
       console.log(this.name + this.className);
   }
  1. 简单的工厂函数:
// 1.提供一个函数(工厂函数)封装对象的创建过程
 function createStudent(name,age) {
// 2.原料:创建对象
     var stu = new Object();
// 3.加工:设置属性和方法
     stu.name = name;
     stu.age = age;
     stu.logDes = function () {
         console.log(this.name);
     };
//4. 出厂:返回这个对象
     return stu;
 }

 var stu1 = creatStudent('zs',20);
 var stu2 = creatStudent('ls',18);
 console.log(stu1, stu2);
  1. 自定义构造函数:
    自定义构造函数的返回值:
    1.如果构造函数内部没有return,返回构造函数内部新创建的对象;

    1. 如果是构造函数内部有return,要看具体情况:
    • 如果返回的是值类型的数据,直接忽略,返回构造函数内部新建的对象;
    • 如果返回是引用类型的数据,返回该引用类型的数据。
    1. 提供一个构造函数;

    1.做一些初始化的设置;
    2. 首字母大写 ;使用new 关键字调用构造函数

    1. 通过this设置属性和方法;
    2. 使用new 创建对象。
// 1.提供一个构造函数
    function Person(name,age) {
         // 默认会创建一个新的对象
        // var obj = new Object();
        // 默认会把这个新的对象赋值给this
       // this = obj;
// 2.通过this设置属性和方法
        this.name = name; // this->构造函数内部新创建的对象;
        this.age = age;
        // 默认会返回新创建的对象
       // return obj;
    }
// 3.使用new 创建对象
    var p1 = new Person('zs',20);
    var p2 = new Person('ls',18);
    console.log(p1, p2);

自定义构造函数和工厂函数的区别
  1. 构造函数首字母大写;
  2. 使用new 调用构造函数;
  3. 构造函数默认会返回新创建的对象,工厂函数需要手动返回.

instanceof:判断对象是否是由制定的构造函数创建的。

 function Person() {
    }

    function Dog() {
    }
    var p = new Person();
    var d = new Dog();
 console.log(p instanceof Person); // true
 console.log(d instanceof Dog); // true
 console.log(p instanceof Dog); // false

获取对象的类型(获取对象是由哪一个构造函数创建出来的)-->构造器属性(constructor)

 function Person() {
    }
    var p = new Person();
    // 每一个对象都有构造器属性
    console.log(p.constructor);//function Person() {}

原型对象:在构造函数创建出来的时候,系统会默认创建一个对象与这个构造函数相关联,这个对象就叫该构造函数的原型对象。

  • 作用:通过构造函数创建出来的对象,默认就可以使用该构造函数原型对象的属性和方法。
  • 如何访问:构造函数.prototype
  • 如何设置:1. 原型对象本质是一个对象,利用对象的动态特性设置原型对象的属性和方法;2. 使用字面量的方式(替换原型);
实例和实例化:
  • 实例化:通过构造函数创建对象的过程称为实例化;
  • 实例:通过构造函数创建出来的对象就是一个实例.一般情况我们在说实例需要说明是哪一个构造函数的实例. 某个对象是XXX构造函数的实例。
原型的使用方法:

利用对象的动态特性设置原型对象。

  • 实例成员:实例属性和实例方法。
  • 原型成员:原型的属性和方法。
 function Person(name) {
        this.name =name
    }
    //增加成员
    Person.prototype.des ='des';
    Person.prototype.showName =function () {
        console.log(this.name);
    }
    //修改成员
    Person.prototype.des = 'log';
    Person.prototype.log = 'des';
    var p1 =new Person('zs');
    console.log(p1.des);//log;
    p1.showName();//zs
  //删除成员
    delete  p1.des;//只能删除实例上的属性而不能删
    除原型对象的属性。
    console.log(p1.des);//log
    delete  Person.prototype.des;
    console.log(p1.des);//undefined
替换原型对象的注意点:
  1. 替换原型对象之前和替换原型对象之后创建的对象,他们的原型对象不是同一个对象;
    建议: 替换原型对象完毕后 在创建对象。
  2. 需要修正构造器属性:替换之后创建的对象的 constructor指向Object,并不是Person。
//构造函数
    function Person(name) {
        this.name = name;
    }
    var p2 = new Person('ls');
    //设置原型对象
    Person.prototype = {
     constructor :Person,//给替换的原型对象设置constructor属性
     des:'des',
     showName:function () {
          console.log(this.name);
        }
    }
   var p1 = new Person('zs');
   console.log(p1.constructor ==p2.constructor);
属性的访问原则

通过对象.属性访问属性的时候,首先会查找自己有没有这个属性,如果有就直接使用;如果没有会查找原型对象上有没有这个属性,如果有就直接使用,如果没有就返回undefined 或者报错;

设置原型属性的注意点:
1.通过对象.属性设置属性的时候,如果没有这个属性就是添加一个新的属性,如果有就是修改;但是不会修改原型对象的属性
2.怎么修改原型对象的属性
1).通过构造函数.prototype.属性修改属性或者替换原型;
2).如果有个属性是引用类型的属性,可以通过对象.属性.属性的方式修改;

 function Person(name) {
        this.name = name;
    }
    Person.prototype.des = 'des';
    Person.prototype.dog = {
        name:'huahua',
        age:3
    };
    var p1 = new Person('zs');
    p1.des = '111';
    console.log(p1.des);
    //有两个操作,先访问p1的dog属性,由于构造函数没有这个属性,所以访问其原型对象的dog属性,再操作dog.name = 'baobao',修改了原型对象的属性。
    p1.dog.name = 'baobao';
    console.log(Person.prototype.dog.name);

__ proto __属性:对象中指向对象的原型对象。
访问原型对象:
1.构造函数.prototype;
2.对象. __ proto __ 。

  1. Object.getPrototypeOf();
    注意点:
  2. __ proto __在正式开发中不要使用;
  3. __ proto __ 是非标准的,ECMA不支持.部分浏览器厂商为了方便程序员调试程序提供的。
 function Person() {
    }
    var p1 = new Person();
  console.log(Person.prototype == p1.__proto__);//true

hasOwnProperty:用于判断对象中是否存在指定的属性(实例属性);

   function  Person(name,age) {
        this.name = name;
        this.age = age;
    }
    Person.prototype.des  ='des';
    Person.prototype.age = 10;
    var  p1 = new Person('zs',20)
    console.log(p1.hasOwnProperty('des'))//false des为原型对象的属性,不属于p1自己的属性。

构造一个函数:判断属性是不是原型属性,并且只能是原型属性。

 function isPrototypeProperty(objName,obj) {
        return (objName in obj) && !obj.hasOwnProperty(objName);
    }

isPrototypeOf:判断一个对象是否是指定对象的原型对象。


    function Person() {
            }
    var obj = {};
    Person.prototype = obj;
    var p1 =new Person();
    console.log(obj.isPrototypeOf(p1));//true
    console.log(p1 instanceof Person);//true
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,107评论 0 6
  • 面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScr...
    DHFE阅读 971评论 0 4
  • 肺炎不是咳出来的,也不是发烧烧出来的,是痰太多了,堵在肺里,满肺泡都是痰,糊死了,孩子喘气都费劲,发烧,咳...
    健康摆渡人阅读 806评论 1 0
  • 今日得到 1.认识你自己,就是要避免灯下黑。认识自己,不是你觉得自己是什么人,而且别人眼里你是什么人。认识自己后,...
    Pheeb阅读 140评论 0 0
  • 这场雨,来的有点突然,又好像意料之中。无论怎样、唯一相同的就是形形色色的路人。吃完饭、撑着伞,汇入那“洪流”,形影...
    七汐堇年阅读 385评论 0 1