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.

 

posted @ 2016-10-15 16:36  飘然离去  阅读(352)  评论(0编辑  收藏  举报