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.加一个层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | //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 ); } };<br> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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.
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· MySQL索引完全指南:让你的查询速度飞起来
· 一个字符串替换引发的性能血案:正则回溯与救赎之路
· 为什么说方法的参数最好不要超过4个?
· C#.Net 筑基-优雅 LINQ 的查询艺术
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· 使用GcExcel .NET将Excel导出为PDF
· 【设计模式】外观模式
· 本地搭建一个对嘴AI工具
· MySQL索引完全指南:让你的查询速度飞起来
· Web前端入门第 72 问:JavaScript DOM 内容操作常用方法和 XSS 注入攻击