JavaScript

JavaScript - 面向对象编程一

2017-02-25  本文已影响50人  西巴撸

开篇废话是一种情怀

在我们开始学习面向对象之前,首先得先想一个问题,那就是何为对象?


Js语言的回顾

大于 >
小于 <
大于等于 >=
小于等于 <=

>**语法:表达式1 || 表达式2
结果:
    判断表达式1,如果表达式1为真,那么就返回表达式
    如果表达式1的值为假,那么就返回表达式2**
- **逻辑与(&&)**
>**语法:表达式1 && 表达式2
结果:
    如果表达式1为真,返回表达式2
    如果表达式1为假,返回表达式1**
- **返回值是表达式,而不是布尔值**
>**string
number
boolean
undefined

值类型:存储的是具体的值
赋值:
1.把右边变量存储存储的值(具体的数据)复制一份给左边的变量
2.值类型的赋值,是简单数据的复制,他们保存在相对独立的空间中,彼此不会影响
**
- 引用类型
>**object类型
引用类型:存储的是指向具体值得地址(引用)
赋值:
1.把右边变量存储存储的值(指向具体数据的地址)复制一份给左边的变量
2.引用类型赋值:修改了某个对象的属性,对另外一个对象的属性会有影响
**
- 在函数中的使用
值类型作为函数的参数:
实参和形参他们的数据是相互独立的

<script>
        function func(param){
            console.log(param);  //我是字符串
            param = "我也是一个字符串";
            console.log(param);
        }
        var a = "我是字符串";
        func(a);
        console.log(a);
</script>

引用类型作为函数的参数:
形参和实参共享同一份数据,修改其中的某个对象对另外一个对象也会有影响

<script>
    //02 引用类型作为函数的参数传递
    var obj = {name:"小明"};
    function funcName(param) {
        param.name = "小王";
        param = {
            name:"张明明"
        };
        console.log(param.name);    // 张明明
    }
    funcName(obj);
    console.log(obj.name);   // 小王
    //
   //
    var arr1 = [1,2,3];
    var arr2 = arr1;
    console.log(arr1);
    console.log(arr2);
    //该行代码切断和arr1的关系,对象内保存的地址指向了另外一块内存空间
    arr1.push(4);
    arr2 = [1,2,3];    
    console.log(arr1);  //1,2,3,4
    console.log(arr2);  //1,2,3
</script>

**
1.点语法
在使用点语法设置对象的属性的时候,如果对象中不存在改属性,就是增加操作
如果对象中已经存在该属性,那么就是修改操作
2.[ ] 中括号语法
对象:键 - 值(key-value)对的集合

注意点:在使用[]语法的时候,键应该使用双引用
**

for循环
while
do...while(至少会执行一次)
for...in(主要用于遍历对象)

<script>
    function 函数名称 (形参1,形参2)
    {
        //函数体
    }

    //调用
    //函数的名称();

    function funcName (){

    }
</script>

函数表达式

<script>
    //01 匿名函数
    var func01 = function (){
    };
    //02 命名的函数表达式
    var func02 = function func(){
    };
</script>

使用构造函数创建函数对象

<script>
    var func = new Function();   //没有内容(没有函数体)
    func();

    function funcTest (){};     //等价

    var func02 = new Function("console.log('demo');");
    func02();
</script>
<script>
    var obj = {name:"zhangsan"};
    var obj2 = new Object();
    var obj3 = {};
</script>

回顾前面这些呢,就是想让接下来看面向对象的时候,脑海中有个印象和回忆,当然,这也是想到会有一些编程小白理解起来困难的原因。知识点有点枯燥,学编程嘛 得有点耐心才行.

面向过程 & 面向对象

如果你是用手洗的话,那就不得不考虑 倒水-搓衣服-加洗衣液-清水涮-手拧干-晾起来 这就是面向过程
但如果你忽略这些步骤 直接放洗衣机洗的话 可能都不用考虑晾干的步骤 这就是面向对象

什么是对象
    var zhangsan = {
            name:"张三",
            sex:"男",
            age:18,
            address:"天上人间1号公馆",

            eat:function () {
                console.log('能吃');
            },
            sleep:function () {
                console.log("能睡");
            },
            say:function () {
                console.log("能说话");
            },
            run:function () {
                console.log("能运动");
            },
            song:function () {
                console.log("能唱歌");
            }
        };

        //打印对象的属性并调用相关的方法
        console.log(zhangsan.name,zhangsan.age,zhangsan.address);
        zhangsan.say();
        zhangsan.sleep();
现实中的对象和编码中的对象
为什么要使用面向对象编程?
js对象是由两个对象组成的
编程语言
面向对象的特性:
创建对象的四种方法
var book1 = {
        name:"悟空传",
        author:"今何在",
        press:"湖南文艺出版社",
        price:"28.00",
        logDes:function(){
            console.log("书名:" + this.name + "作者:" + this.author);
        }
    }
    var book2 = {
        name:"什么是批判",
        author:"福柯",
        press:"北京大学出版社",
        price:"52.00",
        logDes:function(){
            console.log("书名:" + this.name + "作者:" + this.author);
        }
    }
    var book3 = {
        name:"数据结构",
        author:"严蔚敏",
        press:"清华大学出版社",
        price:"30.00",
        logDes:function(){
            console.log("书名:" + this.name + "作者:" + this.author);
        }
    }

    console.log(book1.name);
    boo1.logDes();

存在的问题:
创建的对象无法复用,复用性差
如果需要创建多个相似的对象,那么代码中冗余度太高(重复的代码太多)

    //01 创建空的对象
    var book1 = new Object();
    //02 设置属性
    book1.name = "花田半亩";
    book1.author = "田维";
    book1.price = "40.01";

    //03 设置方法
    book1.logDes = function (){
        console.log("书名:" + this.name);
    }

    book1.logDes();

    //创建多个对象
    var book2 = new Object();
    book2.name = "三国演义";
    book2.author = "罗贯中";
    book2.price = "34.01";
    book2.logDes = function (){
        console.log("书名:" + this.name);
    }
    console.log(book1);
    console.log(book2);

存在的问题:
创建的对象无法复用,复用性差
如果需要创建多个相似的对象,那么代码中冗余度太高(重复的代码太多)

    //01 封装创建对象的过程
    function createBook () {

        var book = new Object();
        book.name = "声名狼藉者的生活";
        book.price = 42.00;
        book.author = "福柯";
        book.press = "北京大学出版社";
        book.read = function () {
            console.log("我的书名为:声名狼藉者的的生活,作者为福柯....");
        };
        return book;
    }

    //02 使用封装好的工厂函数来创建对象
    var book1 = createBook();
    var book2 = createBook();

    //03 打印对象的属性并调用对象的方法
    console.log(book1.name);
    console.log(book2.name);
    book1.read();
    book2.read();

    console.log("_________________________");
    //04 说明:以上代码确实能够快速简单的创建出新的对象,但是创建出来的对象内部的属性和方法相同,这并不是我们想要的。

    //05 对上面的工厂函数进行改进
    //改进思路:封装不变的部分,提取变化的部分作为参数
    function createBookNew (name,price,author,press) {

        var book = new Object();
        book.name = name;
        book.price = price;
        book.author = author;
        book.press = press;
        book.read = function () {
            console.log("我的书名为:"+book.name+",作者为"+book.author+"....");
        };

        return book;
    }

    //06 使用新的工厂函数来创建对象
    var book1 = createBookNew("声名狼藉者的的生活","42.00","福柯","北京大学出版社");
    var book2 = createBookNew("人性的枷锁","49.00","毛姆","华东师范大学出版社");
    var book3 = createBookNew("悟空传","28.00","今何在","湖南文艺出版社");

    //07 打印对象的属性,调用对象的方法
    console.log(book1.name);
    console.log(book2.name);
    console.log(book3.name);

    book1.read();
    book2.read();
    book3.read();

存在的问题:
如果创建多个不同类型的对象,那么我们无法分辨

    //1.提供一个构造函数
    //构造函数简单介绍:
    //作用:对对象进行一些初始化的设置
    //和普通函数区别:(01)首字母大写(02)调用方式不一样和new配合使用
    function Person(name,age){
        // 默认 创建对象
        //var o = new Object();
        //默认会赋值给this
        //this = o;
        //2. 通过this指针来设置属性和方法
        this.name = name;
        this.age = age;
        this.showName = function(){
            console.log(this.name);
        };
        this.showAge = function(){
            console.log(this.age);
        }
        //默认返回
        //return this;
    }
    //3. 使用new操作符来创建对象
    var p1 = new Person("张三",20);
    var p2 = new Person("张老汉",200);
    console.log(p1);
    console.log(p2);
/*
 1.  自定义构造函数方式创建对象内部的实现细节
1.1 我们在使用new关键字调用构造哈函数的时候,内部默认会创建一个空的对象
1.2 默认会把这个空的对象赋值给this
1.3 通过this来设置新对象的属性和方法
1.4 在构造函数的最后,默认会把新创建的对象返回
2.自定义构造函数和工厂函数对比
2.1 函数的名称不一样,构造函数首字母大写
2.2 自定义构造函数创建方式内部会自动的创建空对象并且赋值给this
2.3 默认会自动返回新创建的对象
3.返回值
3.1. 没有显示的return ,默认会把新创建的对象返回
3.2. 显示的执行了return语句,就得看具体的情况
3.2.1 返回的是值类型,那么直接忽略该返回,把新创建的对象返回
3.2.2 返回的是引用类型的数据,会覆盖掉新创建的对象,直接返回引用数据类型的值
*/
        function Dog(name)
        {
            this.name = name;
            //return "demo";  忽略
            //return function (){};
        }

        var dog = new Dog("阿黄");
        console.log(dog);
构造函数的的注意事项
function Student(number,className,log){
        this.number = number;
        this.className = className;
        this.log = log;
    }

    var stu1 = new Student("201601","九阴真经修炼01班",function(){
       console.log("学号:" + this.number);
    });

    var stu2 = new Student("201602","九阴真经修炼01班",function(){
        console.log("班级名称:" + this.className);
    });

    stu1.log();
    stu2.log();
function Person(){};
    function Dog(){};

    var p1 = new Person();
    var dog1 = new Dog();

    //关键字 instanceOf 用来判断当前对象是否是某个类型的实例(检查某个对象是否是使用指定构造函数创建的)
    //语法: 对象 instanceOf 构造函数(类型)
    console.log(p1 instanceof Person);
    console.log(p1 instanceof Dog);
    console.log(dog1 instanceof Person);
    console.log(dog1 instanceof Dog);
function Person(){};
    function Dog(){};
    var p1 = new Person();
    var dog1 = new Dog();

    //在所有的对象中,都拥有一个构造器属性:constructor
    console.log(p1.constructor);
    console.log(dog1.constructor);
function Person(name)
    {
        if(this instanceof Person)
        {
            this.name = name;
        }else
        {
            return new Person(name);
        }
    }

    var p1 = new Person("哔哩哔哩");

    //构造函数本身是一个函数,在调用可以直接调用
    var p2 =  Person("哗啦哗啦");  //这是一个错误的演示(不要这样写代码)
    console.log(p2);  //undefined
var showName = function(){
            console.log("姓名:");
    }

    function Person(name,age){
        this.name = name;
        this.age = age;
        this.showName = showName;
    }

    //创建对象
    var p1 = new Person("张小花",18);
    var p2 = new Person("张全蛋",99);
    p1.showName();
    p2.showName();

    //每创建一个对象,内部都会声明一个showName函数
    console.log(p1.showName == p2.showName);  //false

思维导图 --> 如果图片不是很清晰的话 请下载到本地查看 !

**Js - 面向对象编程一**
未完待续! 接下来会讲解构造函数的原型对象!!
内容枯燥, 但是每一个牛逼的工程师都是这样一步一步走过来的.

上一篇 下一篇

猜你喜欢

热点阅读