美文网首页
2017-08-14

2017-08-14

作者: 巴拉巴啦 | 来源:发表于2017-08-15 14:54 被阅读4次

    面向对象编程
    用对象的思想去写代码,就是面向对象编程
    -面向过程
    -面向对象
    面向对象编程的特点
    1.抽象 抽取一样的东西,抓住核心问题
    2.封装 只能通过对象访问
    3.继承 从已有对象上继承出新的对象

    1. 多态 多对象的不同形态

    对象的属性:对象下面的变量
    对象的方法:对象下面的函数

    var obj = {};
    obj.name = "Tom";
    obj.sayName = function(){
      alert(this.name);      //注意:this所属于这个函数,谁调用这个函数,this就指向谁。现在obj调用 ,那么this就指向obj,如果下面直接调用像这样sayName()那么this就指向window
    }
    
    obj.sayName(); //Tom
    
    

    工厂方式:封装函数
    当new去调用一个函数时,这个this就是创建出来的对象,而且函数的返回值直接就是this啦(隐式返回)

    new后面的函数叫做构造函数

    基本类型:赋值的时候只是值的复制
    对象类型:赋值不仅是值的复制,而且也是引用的传递

    比较
    基本类型:值相同就可以
    对象类型:值相同且 引用也相同


    原型:去改写对象下面的公共的方法或者属性,让公共的方法或者属性在内存中存在一份(提高性能)
    原型和普通方法的区别
    原型:类比css中 的class
    普通方法:类比css中的style
    1)style的优先级高于class 2)style不能复用

    原型要写在构造函数下

    面向对象的拖拽


    2高级
    JS源码:系统对象是基于原型的程序
    尽量不去修改和添加系统对象的方法和属性
    arguments是实参的集合

    包装对象:基本类型有自己的包装对象(String,Boolean,Number。null和undefined没有自己的包装对象)

    var str = "hello";
    typeof(str) //String
    str.charAt(0)
    过程:基本类型会找到对应的包装对象类型,然后把包装对象的所有属性和方法给 了基本类型,然后包装对象消失
    
    var str = "number";
    str.number = 10;// 给String包装对象上加了属性number
    alert(str.number) //undefined  包装对象消失这里的str的原型String上面没有属性number
    

    原型链
    实例与原型之间的连接叫做原型链,__ proto__
    原型链的最外层是Object
    hasOwnPrototype() 看是不是自身下面的属性
    constructor 查看对象的构造函数

    function Aa(){
    }
    var a1 = new Aa();
    (每个函数都会有的都是)系统会自动生成 Aa.prototype.constructor = Aa;
    constructor是 Aa的prototype下面的属性
    hasOwnProperty是Object下面的属性
    //a1.hasOwnPrototype == Object.prototype.hasOwnPrototyppe 返回true

    for in的时候有些属性是找不到的
    避免修改constructor属性

    instanceof运算符:对象与构造函数在原型链上是否有关系

    toString()把对象转换成字符串,可以穿参数 进制数
    toString()可进行类型判断

    1)系统对象的toString方法在系统对象的prototype下面,
    自己创建的对象在Object.prototype下面
    2)Object.prototype.toString.call()
    判断类型最靠谱

    var arr = [1,2];
    alert(Object.prototype.toString.call(arr)) //返回'[object Array]'
    所以利用Object.prototype.toString.call(arr) == '[object Array]可以判断是不是数组
    其他两种方法
    arr instanceof Array
    arr.constructor == Array但是这两种方法在iframe的时候有问题
    栗子:
            var fr = document.createElement("iframe");
            document.body.appendChild(fr);
            var ifArray = window.frames[0].Array;
            var arr = new ifArray();
            console.log(arr instanceof Array)    //false
            console.log(arr.constructor == Array)  //false
            console.log(Object.prototype.toString.call(arr) == '[object Array]')   //true
    

    对象的继承
    什么是继承:
    在原有的基础上,略修改,得到一个新的对象
    不影响原有对象的功能
    如何添加继承
    属性:call(用call的方式调用父类的函数)
    ****方法:for in (拷贝继承jquery也是采用拷贝继承参考extend)****

    继承的好处:子类不影响父类。子类可以继承父类的一些功能(代码复用)

    1拷贝继承 比较通用 有new无new都可以
    2.类式继承 适合有new 的构造函数
    JS是没有类的概念,可以吧JS中的构造函数看做类
    Bb.prototype = new Aa()
    注意:constructor和继承时属性不相互影响
    F.prototype = Aa.prototype;
    Bb.prototype = new F();
    Bb.prototype.constructor = Bb;
    3)原型继承 适合无new 的对象
    借助原型来实现继承

    var a = {
                name : "Tom"
            };
            var b = cloneObj(a);
            function cloneObj (obj) {
                var F = function(){}
                F.prototype = obj;
                return new F();
            }
    
    

    组件开发
    参数个数和顺序的问题

        function exdtend(obj1,obj2){
            for(var attr in obj2){
                obj1[attr] = obj2[attr];
            }
        }
    
    var a = {
        name : "xx" //配置参数
    }
    var b = {
        name:"mm" //默认参数 key值一定要相同 配置参数才能覆盖默认参数
    };
    extend(b,a)
    alert(b.name)
    

    面向对象的设计模式:单体模式
    组件:对面向对象的深入应用
    UI组件,功能组件
    将配置参数,方法,事件(自定义)三者相分离
    自定义事件:主要是和函数有关,让函数能够具备事件的某些特性,需要主动触发

    有利于多人协作

    相关文章

      网友评论

          本文标题:2017-08-14

          本文链接:https://www.haomeiwen.com/subject/vpxwfxtx.html