zoukankan      html  css  js  c++  java
  • js中什么时候回考虑用call或者apply

    这里我说出自己的浅薄的理解,希望大家可以共鸣!

    call一些装逼的用法:

    call的用法通常在两个地方会用到,

    1.需要加一个层的时候,也可以不准确的说继承的时候,继承是继承父类的属性或者方法,而aop面向切面的思想中,我们可以清晰的感到,加层的好处,如果在js的代码中,我们开始考虑用加一个层做一些统一的额外操作,或者额外的功能的时候,可能用call.

    2.还有一个地方,就是我们通常,喜欢封装一个class或者object对象,比如类a或者b,当a调用b后,在b中可能会有很多的操作用到a中的对象属性,或者方法,这个时候我们希望极少的传入一个this或者一个obj,就可以操作一个这个对象内部的所有的东西,这个时候就会考虑用call.

    3. 也可以说是2的补充,当我们的代码是

      var ad = {

     a:function(){

     var self = this;  

    },

    b:function(){

    var self = this;

    self.a();

    }

    }

    在别的地方调用ad.b()会发生作用于错乱的情况,如果用ad.b.call(ad);这样子就避免了,域的错乱

    举例:

    1.加一个层

    //BaseModel
    'use strict';
    function BaseModel() {
        this.Members = {};
    }
    BaseModel.prototype.init = function (obj) {
        if (obj && typeof obj == 'object') {
            for (var key in this.Members) {
                if (typeof obj[key] != 'undefined') {
                    if (typeof this.Members[key].default != 'undefined') {
                        this[key] = obj[key] || this.Members[key].default;
                    } else {
                        this[key] = obj[key];
                    }
                } else {
                    this[key] = this.Members[key].default || "";
                }
            }
        } else if (arguments.length > 1) {
            this.initWithData.apply(this, arguments);
        }
    };
    BaseModel.prototype.ado = function () {
        var ado = this;
        delete ado.Members;
        return ado;
    };
    BaseModel.prototype.ado = function () {
        var ado = this;
        delete ado.Members;
        return ado;
    };
    //order.js
    function Order() {
        this.Members = {
            'id': {},
            'name': {},
            'ad_id': {},
            'description': {},
            'platform': {},
            'platformName': {},
            'adName': {},
            'deliverType': {
                'default': 'auto'
            },
            'startTime': {},
            'duration': {},
            'endTime': {},
            'state': {},
            'creator': {},
            'createtime': {},
            'streams': {},
            'albums': {},
            'videos': {},
            'targetType': {},
            'target_type':{},
            'target_catelog':{},
            'updater': {},
            'updatetime': {},
            'pushstate': {},
            'offset': {},
            'groupId': {},
            'isCopy':{},
            'copyFrom':{},
            'editAfterCopy':{},
            'orderType':0,   //是否是打点订单,0表示普通订单,1表示可视化打点订单
            'coordinate':{} //可视化打点的坐标,x距视频左端的百分比,y是距视频顶端的百分比,这里是序列化后的json字符串
        };
        this.init.apply(this, arguments);
    }
    function Order_Targeting() {
        this.Members = {
            'id': {},
            'order_id': {},
            'target_catelog':{},    
            'target_type': {},    
            'target_value': {},
            'createtime': {},
            'operator': {},
            'parent_id': {}
        };
        this.init.apply(this, arguments);
    }
    Order.prototype = {
        insert: function () {
            return Order.insert(this);
        },
        update: function () {
            return Order.update(this);
        },
        pushState: function () {
            return Order.push2Redis(this);
        }
    };

      

    Order.findAll = function (gid) {
        var deferred = Q.defer();
        var sql = SELECT_ALL, values = [];
        if (gid) {
            sql = SELECT_ALL_GID;
            values = [gid];
        }
        pool.query(sql, values, function (err, reply) {
            if (err) {
                deferred.reject(err);
            } else {
                var arr = [];
                if (reply) {
                    reply.forEach(function (n) {
                        arr.push(new Order(n).ado());
                    })
                }
                deferred.resolve(arr);
                ;
            }
        });
        return deferred.promise;
    };
    

      

    2.

  • 相关阅读:
    字符转换(2,8,10,16进制,ASCII码)
    js正则表达式验证
    不能在DropDownList 中选择多个项
    SQL中sum(),avg()等统计结果为null的解决方法
    文本框TextBox只允许输入数字,不用onkeyup
    ORA01830: 日期格式图片在转换整个输入字符串之前结束
    Oracle数据库中的左连接与右连接
    asp.net服务器验证控件失效的问题
    在博客园开通博客的第一天
    米勒拉宾素数测试
  • 原文地址:https://www.cnblogs.com/coding4/p/5964726.html
Copyright © 2011-2022 走看看