• js面向对象


    面向对象-创建方式

    第一种json方式

    //推荐使用场景:作为函数的参数 临时只用一次的场景 如设置函数原型对象
    var obj={};
    var obj2={
        name:"weizai",
        age:18,
        sayHi:function(){
            console.log("hi");
        }
    }
    //添加其他属性
    obj2.newProp=123; //js动态属性 没有要访问的属性 直接添加属性
    //缺点 不能作为对象创建的模板 new不可以
    
    //=====================================================
    
    

    第二种 创建面向对象的方式 new Object() 不推荐

    var obj3=new Object();
    //添加属性
    obj3.name='kitty';
    obj3.syaHi=function(){
        console.log(name+' '+'sayHi');
    };
    
    //跟上面的方式一样 只能临时用一次这个对象 new不可以
    
    

    第三种 构造函数构造对象方法

    //把一个函数对象 当作构造函数使用 一般要把函数对象的首字母大写
    function Person(){
        this.name='13';//通过this可以直接给 构造出来的对象添加属性
        this.sayHi=function(){
            console.log(this.name);
        }
    }
    
    var p=new Person();
    // new运算符作用
    // 第一步:
    // 执行构造函数(new后面那个函数) 
    // 在构造函数内部创建一个空对象
    // 第二步:
    // 把上面的空对象跟构造函数的原型对象进行关联
    // 第三步:然后把this指向当前空对象
    
    console.log(p.name);//p.name 从构造函数里面创建的
    p.sayHi(); //此方法内部的this执行p对象
    
    

    第三种方式的升级改造版本

    //第三种方法的缺点:对象的内部函数会在每个对象中都存在一份
    //如果创建非常多的话 非常浪费内存 
    //函数的行为是所有对象可以共有的 不需要每个对象都保存一份
    //把函数放到原型中进行声明 所有的对象都有了公共的函数 而且内存中只保留一份
    //所有的属性写道对象的内部
    function Sprite(){
        this.name='123';
        this.age=19;
    }
    Sprite.prototype={
        sayHi:function(){
    
        },
        init:function(){
    
        }
    };
    //继续升级 属性作为参数
    function Sprite(sname,sage){
        this.name=sname||'';
        this.age=sage||18;
    }
    Sprite.prototype={
        sayHi:function(){
    
        },
        init:function(){
    
        }    
    }
    
    //问题:1.调用者如果传递参数的顺序发生变化 那么废了
    //问题:2.参数增减会导致函数声明变化 调用的地方也可能发生变化
    //继续升级
    function Sprite(option){
        //用一个参数把所有参数覆盖
        this.name=option.name||'';
        this.age=option.sage||18;
    }
    Sprite.prototype={
        sayHi:function(){
    
        },
        init:function(){
    
        }
    };
    //继续优化 把初始代码放到init函数中
    function Sprite(option){
        this.init(option);
    }
    Sprite.prototype={
        sayHi:function(){
    
        },
        init:function(option){
            this.name=option.sname||'';
            this.age=option.sage||18;
        }
    };
    
    
    

    补充js调用的四种模式

    • 方法调用模式
    function Person(){
        var name1="itcast";
        age1=19;
        show1=function(){
            console.log(this.name);
        };
        return {
            age:age1,
            name:name1,
            show:show1
        };
    }
    var p=new Person();
    p.show(); //show方法中this指向了p对象
    
    • 函数调用模式
    function add(a,b){
        this.result=a+b;
    }
    add(3,9);//此方法调用时 this指向了window
    console.log(result);
    
    • 构造器调用模式
    function Person(){
        this.name="123";
        this.age-19;
        this.show=function(){
            console.log(this.name);
        };
    }
    var p=new Person();
    p.show(); //show方法中方法this 指向了p对象
    
    • call和apply调用模式
    function add(a,b){
        this.result=a+b;
    }
    var p={};//定义一个空对象
    add.call(p,3,4);//this指向了p
    //apply和call一样的用法 apply第二个参数用数组传递
    
  • 相关阅读:
    HTML5 GeoLocation 地理定位
    HTML5 LocalStorage 本地存储
    JS-事件代理(委托)
    面向对象(封装、继承、多态)
    js图片预加载
    jQuery 事件
    svn无法验证
    Ext.data.Store(转)
    ExtJS实现Excel导出(转)
    <![CDATA[ ]]> 意思
  • 原文地址:https://www.cnblogs.com/weizaiyes/p/6251639.html
Copyright © 2020-2023  润新知