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.
js中什么时候回考虑用call或者apply的更多相关文章
- 【第三周读书笔记】浅谈node.js中的异步回调和用js-xlsx操作Excel表格
在初步学习了node.js之后,我发现他的时序问题我一直都很模糊不清,所以我专门学习了一下这一块. 首先我们来形象地理解一下进程和线程: 进程:CPU执行任务的模块.线程:模块中的最小单元. 例如:c ...
- JS中this的指向问题&使用call或apply模拟new
this的指向由调用时决定而不是定义时决定,定义的方式: //直接定义在函数里 var a="window中的a"; var name="window"; fu ...
- JS 中的this指向问题和call、apply、bind的区别
this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...
- js中几种实用的跨域方法原理详解(转)
今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...
- js中几种实用的跨域方法原理详解
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- js中各种跨域问题实战小结(一)
什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源策略 ...
- js中==, !==, === ,!=的区别
在讨论比较符的时候我们先要来讨论哈js的类型,这样有助于我们从本质上了解原理. 下面是我找的资料加上个人的总结: js中有5种数据类型:Undefined.Null.Boolean.Number和St ...
- 聊一下JS中的作用域scope和闭包closure
聊一下JS中的作用域scope和闭包closure scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久 ...
- js 中的算法题,那些经常看到的
js中遇到的算法题不是很多,可以说基本遇不到.但面试的时候,尤其是一些大公司,总是会出这样那样的算法题,考察一个程序员的逻辑思维能力.如下: 1.回文. 回文是指把相同的词汇或句子,在下文中调换位置或 ...
随机推荐
- ubuntu下apache2 安装 配置 卸载 CGI设置 SSL设置
一.安装.卸载apache2 apache2可直接用命令安装 sudo apt-get install apache2 卸载比较麻烦,必须卸干净,否则会影响ap ...
- centos6.5编译安装lamp开发环境
一.系统以及软件的准备 系统及编译安装包的下载地址:http://pan.baidu.com/s/1jIjqinc 密码:ghc2 说明:由于centos6.5是分卷压缩的,且压缩为三个压缩包,所 ...
- python笔记-调用eval函数出现invalid syntax错误
本来是想打算使用eval函数对变量进行赋值的,没想到出现了invalid syntax错误.源代码如下 In [2]: eval('a = 1') File "<string>& ...
- 网格弹簧质点系统模拟(Spring-Mass System by Euler Integration)
弹簧质点模型是利用牛顿运动定律来模拟物体变形的方法.如下图所示,该模型是一个由m×n个虚拟质点组成的网格,质点之间用无质量的.自然长度不为零的弹簧连接.其连接关系有以下三种: 1.连接质点[i, j] ...
- POJ1384Piggy-Bank[完全背包]
Piggy-Bank Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10787 Accepted: 5258 Descr ...
- AC日记——合法C标识符 openjudge 1.7 06
06:合法 C 标识符 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个不包含空白符的字符串,请判断是否是C语言合法的标识符号(注:题目保证这些字符串一定不是C语言的保留字 ...
- QC学习一:Windows环境中Quality Center 9.0安装详解
一.安装前准备 1.安装环境:windows XP.SQL Server2005 2.准备安装文件:Quality Center 9.0 (qc10以上,包括qc10,qc只支持安装在服务器操作系统上 ...
- 利用T-Sql语句中的二重循环打印乘法口诀表
--定义三个初始化变量 declare @a int,@b int,@c varchar(200) --对@a进行赋值 set @a=1 --循环输出9次,@a为被乘数 while(@a<=9) ...
- androidSDK无法更新的解决方法之一
方法来源于: http://www.eoeandroid.com/thread-281075-1-1.html 试试这个,能解决国内访问Google服务器的困难启动 Android SDK Manag ...
- Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录
Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...