这里我说出自己的浅薄的理解,希望大家可以共鸣!
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.