js面向对象

  1. 面向过程:
    注重于流程顺序
        1.分析解决问题都需要哪些步骤
        2.将这些步骤一步一步封装成方法
        3.根据业务逻辑,将方法依次调用
  1. 面向对象:oop
  Object Oriented Programming 
  对象   面向    编程
 核心思想:关注的是 以事务为中心 提取顺序流程中的参与者(对象) 将各个流程顺序进行划分。
编写到各个参与者的方法里面,各自按照约定好的顺序,执行各自的流程顺序,来共同完成一个业务逻辑

对象的范畴:万物万事皆对象
对象的特征: 属性
对象的行为:方法
在程序上,对象是一组行为和特征的数据集和

常见对象:标签对象 BOM对象 系统内置对象
window history localStorage 系统内置对象函数 本身也是一个对象
人为定义的对象

 // 系统内置 new Object()创建空对象 
        var obj = new Object();
        console.log(obj);
        // 字面量的形式创建对象
        var obj1 = {};
        console.log(obj1);
        console.log([obj1]);

        // 对象是属性和方法的集合
        // 给对象动态添加方法
        obj.name = '文文' //添加属性
        obj['say'] = function () { //添加方法
            console.log('hello world');
        }
        obj1['name'] = '刘';
        obj1['say'] = function () {
            console.log('000');
        }
        console.log(obj);
        // 系统对象
        var arr = new Array();
        var str = new String();
        var num = new Number();
        var bool = new Boolean();
  1. 构造方法创建对象
    // 通过构造函数来写一个人的类
    function Person(name, age) {
        this.name = name || '小';
        this.age = age || 0;
        this.say = function() {
                console.log(this.age);
                console.log('hello world');
            }
            // 如果构造函数里面返回this,则这个this代表window对象
            // return this;
    }
    // 创建对象

    var p1 = new Person('小明', '3')
    console.log(p1);
  1. js对象的产生
    对象抽象成类,类实例化成对象
    直观上来说:通过new产生的 类的实例化
    JS中所有的对象,都是由一个原型对象拷贝自己产生的
    获取当前对象的原型对象:Object.getPrototype(要检查的对象)
 // 原型的属性和方法的访问
    function Animal() {
        this.name = '小明';

    }
    // 实例化对象
    var a1 = new Animal();
    console.log(a1.name);
    console.log(a1);
    Animal.prototype.type = 'dog';
    Animal.prototype.name = '大明';
    var a2 = new Animal()
    console.log(a2);
    console.log(a2.type);
    a2.type = 'cat'
    console.log(a2);
    console.log(Animal.prototype.type);
对象在访问属性和调用方法时,首先会在自己的属性和方法上面查找
如果能找到,直接调用,未找到,就去原型对象上找,找到后执行

对象对于原型对象的属性和方法是只读操作,无法修改原型对象的属性和方法
如果给对象设置跟原型对象一样的属性名和方法
相当于给对象本身设置了一个新的属性和方法,并且与原型的属性和方法重名
之后访问这个重名的属性和方法,就只能访问到自身,而不能直接访问到原型
  1. 多态
    多态:利用面向对象解决switch case
    执行同一个方法,传入的对象不一样,输出的结果不一样
        分离的思想:
            将程序中变化的部分和不变的部分分离
            将变化的部分当做参数传入函数
            在函数内部将相同部分的对象方法调用
            根据不同的对象自动输出不同的结果
            尽可能的消除了分支语句,方便系统的扩展
    function Dog() {
        this.say = function() {
            console.log('汪汪');
        }
    }

    function Cat() {
        this.say = function() {
            console.log('喵喵');
        }
    }

    function Cattle() {
        this.say = function() {
            console.log('哞哞');
        }
    }

    function Sheep() {
        this.say = function() {
            console.log('咩咩');
        }
    }

    // 调用方法
    function makeSound(obj) {
        obj.say()
    }
    var d1 = new Dog();
    makeSound(d1)
    var d2 = new Cat();
    makeSound(d2)
  1. 继承
// 继承
    function Person() {
        this.type = '人';
        this.name = '123';
        this.age = 18;
        this.say = function() {
            console.log('hi');
        }
    }

    function Man() {
        this.sex = 1;
    }
    // 相当于Person实例化一个对象,覆盖掉Man的原型对象
    // 未覆盖前,Man的原型对象构造函数指向Man
    // 覆盖后,Man.prototype.constructor指向Person
    // 所以需要将其改写回来,重新指向Man
    Man.prototype = new Person(); //指向person
    Man.prototype.constructor = Man //改写回来指向自己
    var m1 = new Man()
    console.log(m1);
    console.log(Man.prototype.constructor);
    console.log(m1.name); //可使用person的属性

    function Kids() {
        this.age = 3;
    }
    Kids.prototype = new Man()
    Kids.prototype.constructor = Kids
    var k1 = new Kids()
    console.log(k1.type); //可使用person、man的属性
    console.log(k1.age);
   // 构造函数式继承
    function Person(name, age) {
        this.name = name;
        this.age = age;
        console.log('111');
    }
    // 使用apply和call功能几乎一样,区别参数的形式不同
    // call可以有多个参数,第一个参数是指向的对象,其余参数为实参
    // apply只有两个参数,第一个参数是指向的对象,第二个参数是实参数组
    function Man(name, age) {
        // Person.call(this, name, age)
        Person.apply(this, [name, age]) //改变this指向person
        this.sex = 1;
    }
    var m1 = new Man(2, 3)
    console.log(m1);
    m1.age = 0
    console.log(m1.age);
  1. 封装
    面向对象封装的特性
    js面向对象 封装方法是通过构造函数来实现的
    封装优点:1.数据隐藏 可以将代码中敏感的算法、变量、常量,隐藏在对象的私有变量中,仅供内部使用
            2.安全性 强制通过自定义的方法 来实现内部和外部的数据交互 达到数据过滤的效果
                一般来说,设置通常用  ...+setter+...来命名方法
                         获取通常用  ...+getter+...来命名方法
// 定义一个构造函数
    function Home() {
        // 私有属性
        var money;
        // 公共属性
        this.name = 'qwqq'
            // 公共方法
        this.Asetter = function() {
            var num = rand(500, 5000)
            money = num;
        }
        this.Agetter = function() {
                return money - 500;
            }
            // 私有方法
        function rand(min, max) {
            return Math.round(Math.random() * (max - min) + min)
        }

        // 数据隐藏
        this.age = 0;
        this.ageChange = function(n) {
            this.age = n;
        }
    }
    var h1 = new Home()
    h1.Asetter();
    console.log(h1.Agetter());
    console.log(h1.money);

    // 数据隐藏
    console.log(h1.ageChange(20));

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

推荐阅读更多精彩内容

  • 1. 面向过程: 注重于流程顺序 2. 面向对象:oop 对象的范畴:万物万事皆对象对象的特征: 属性对象的行为:...
    晴空0_0阅读 156评论 0 0
  • 上一篇讲到js实现对类对封装,本篇介绍类的继承,多态。 类的继承 类式继承 类式继承方式是将父类的实例赋在子类的原...
    镜轩夕照阅读 559评论 0 3
  • 写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程...
    grain先森阅读 491评论 0 3
  • 面向对象的特性: 封装 继承 多态 封装作用:方便代码的维护,提高代码的复用性,更安全的访问数据的方式注意:js中...
    柠檬糖阅读 272评论 1 3
  • JS面向对象 oop 继承:实例可以继承A对象中的方法和属性,减少代码冗余 封装:对象把实现过程封装在方法中,调用...
    Taco_King阅读 421评论 0 0