03_JS面向对象

知识点

  • 面向对象的三大特性
  • 封装
  • 继承
  • 多态
  • 创建对象的几种方式
  • 字面量形式
  • 使用内置构造函数
  • 封装简单的工厂函数
  • 自定义构造函数
  • 构造函数
  • 什么是构造函数?
  • 对象的创建过程
  • 构造函数的返回值
  • 对象是无序的键值对儿的集合
  • 如果像使用正常的函数一样使用构造函数
  • 获取对象类型

面向对象的三大特性

封装

对象是将数据与功能组合到一起, 即封装

  • js 对象就是 键值对的集合
  • 键值如果是数据( 基本数据, 复合数据, 空数据 ), 就称为属性
  • 如果键值是函数, 那么就称为方法
  • 对象就是将属性与方法封装起来
  • 方法是将过程封装起来
  //封装
        var name = "张学友";
        var age = 18;

        function sayHello(){
            console.log("hello world");
        }
        var obj = {
            name : "刘德华",
            age : 50,
            sayHello : function () {
                //.....
            }
        }
        var itcast = {
            getEle:{

            },
        }

继承

所谓继承就是自己没有, 别人有,拿过来为自己所用, 并成为自己的东西
让某个类型的对象获得另一个类型的对象的属性的方法

  • js 继承基于对象
  • 在JavaScript中,继承就是当前对象可以使用其他对象的方法和属性。
  • js继承实现举例:混入(mix)
function mix ( o1, o2 ) {
    for ( var k in o2 ) {
        o1[ k ] = o2[ k ];
    }
}
<script>
        //继承
        //javaScript当中的继承是指
        //一个对象没有一些方法和属性,但是另外一个对象有
        //把另外一个对象的属性和方法,拿过来使用,就是继承

        var obj = {

        };

        var obj1 = {
            name : "张学友",
            sayHello: function () {
                console.log("你好,我是张学友");
            }
        }

//        obj.sayHello();

        //混入式继承(mix-in)  for in
        for(var k in obj1){
            //k可以获取到对象的每一个属性
            //obj1[k]可以获取到对象的每一个属性的值
            //这里使用k给对象新增属性的时候,不可以使用点语法
            obj[k] = obj1[k];
        }

        obj.sayHello();
    </script>

多态

  • 把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
  • 多态是在强类型语言中比较常用,JavaScript中没有相应的体现
  • 使用父类的引用(指针)指向子类的对象 就叫做多态
  • 使用多态来隐藏不同
动物 animal = new 子类(); // 子类:麻雀、狗、猫、猪、狐狸...
动物 animal = new 狗();
animal.叫();

创建对象的方式

  • 字面量形式
    只能创建一次对象,复用性较差,如果要创建多个对象,代码冗余度太高
  var obj = {
            name:"演员",
            singer:"薛段子手",
            type:"流行"
        };
        var obj1 ={
            name:"吻别",
            singer:"张学友",
            type:"流行"
        }
  • 使用内置构造函数
    //使用内置构造函数
    var obj = new Object();
    obj.name = "一千个伤心的牛油";
    obj.singer = "张学友";
    obj.sing = function () {
        console.log("一千个伤心的牛油");
    }

    var obj2 = new Object();
    obj2.name = "一千个伤心的牧流";
    obj2.singer = "张学友";
    obj2.sing = function () {
        console.log("一千个伤心的牧流");
    }
  • 封装简单的工厂函数
    本质还是内置构造函数,已经不推荐使用了
 function createSong(SingerName,SingName){
        var obj = new Object();
        obj.name = SingerName;
        obj.singer = SingName;
        obj.sing = function () {
            console.log("一千个伤心的牛油");
        }
        return obj;
    }
    var obj = createSong("一千个伤心的牛油","张学友");

自定义构造函数

  • 什么是构造函数?
  • 构造函数其实也是函数,但是通常用来初始化对象,并且和new关键字同时出现
  • new 是用来创建对象的,构造函数是用来初始化对象的(给对象新增成员)
  • 构造函数名,首字母要大写!以示区分
<script type="text/javascript">
    //自定义构造函数
    function Person(){
        //默认隐含的操作,把刚才用new新创建出来的对象赋值给this
        this.name = "美女";
        this.age = 45;
        this.sayPaPa = function () {
            console.log("啪啪");
        }
//        return 123;
        return [1,2];
    }
    var p = new Person();
    console.log(p);
    p.sayPaPa();
</script>
  • 对象的创建过程
function Person(name, age){
    this.name = name;
    this.age = age;
}
var p = new Person();

以上面这个p对象创建为例:

  • 首先使用new关键字创建对象,类似于使用{},这个时候创建出来的对象是一个"没有任何成员"的对象。这里需要注意两点:
    1, 使用new关键字创建的对象,对象的类型就是创建这个对象使用的构造函数的函数名
    2, 使用{}创建对象,对象的类型一定是Object,相当于使用了new Object()

  • 使用构造函数为其初始化成员
    1, 在构造函数调用开始的时候,有一个赋值操作,也就是让this = 刚创建出来的对象
    2, 在构造函数中,this就代表刚创建出来的对象

  • 在构造函数中,利用对象的动态特性,为对象添加成员

  • 构造函数的执行过程

  1. 使用new关键字创建对象
  2. 调用构造函数,把新创建出来的对象赋值给构造函数内的this
  3. 在构造函数内使用this为新创建出来的对象新增成员
  4. 默认返回新创建的这个对象 (普通的函数,如果不写返回语句,会返回undefined)
  • 构造函数的返回值
  1. 如果不写返回值,默认返回的是新创建出来的对象 (一般都不会去写这个return语句)
  2. 如果我们自己写return语句 return的是空值(return;),或者是基本类型的值或者null,都会默认返回新创建出来的对象
  3. 如果返回的是object类型的值,将不会返回刚才新创建的对象,取而代之的是return后面的值
  • 对象是无序的键值对儿的集合
    function Animal(name, type, barkWay) {
        this.name = name;
        this.type = type;
        this.bark = barkWay;
    }
  • 如果像使用正常的函数一样使用构造函数
  • 构造函数中的this将不再指向新创建出来的对象(因为根本就没有创建对象)
  • 构造函数中的this这个时候指向的就是window全局对象
  • 当使用this给对象添加成员的时候,全部都添加到了window上
            Animal("","",function () {
                console.log("我是函数");
            }); //这是一个错误的演示

            window.bark();
  • 获取对象类型
  • typeof 对象实例,获取的是object
            var dog = new Animal("大黄","BYD",function () {
                console.log("汪汪汪");
            });
            console.log(dog);
            var cat = new Animal("小花","BSM",function () {
                console.log("喵喵喵");
            });
            console.log(typeof cat);//object
  • js中提供了两个方法来调用其他对象的方法:call、apply
  • 获取具体类型的方式
            var typeStr = Object.prototype.toString.call(想获取类型的对象)
            typeStr = typeStr.slice(8, -1);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 1,371评论 3 12
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,295评论 18 399
  • title: js面向对象date: 2017年8月17日 18:58:05updated: 2017年8月27日...
    lu900618阅读 538评论 0 2
  • 很多人的眼中,英文词典就是用来解释词语意思的,所以随便搞本地摊上的英汉双解就可以应付着用了。 实际上,没有那么简单...
    胡巍阅读 1,246评论 1 8
  • 最近设计智能门锁,忽然发现,其实生产环节中也是需要一个自动化录入环节的工位。 典型的需求 从MCU读取唯一序列号U...
    小鱼儿他老汉阅读 250评论 0 0