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.回文. 回文是指把相同的词汇或句子,在下文中调换位置或 ...
随机推荐
- SQL语句查询某表的所有字段及数据类型
SQL语句查询某表的所有字段及数据类型 SELECT name AS column_name , TYPE_NAME(system_type_id) AS column_type , max_leng ...
- DataTable转换为Json格式
private string DataTableToJson(DataTable dt) { string Json = ""; Json = Json + "[&quo ...
- 数据结构杂谈(二)简单有趣的地精排序Gnome sort
很早之前便听说过地精排序的名字,今天自己看来一下,发现这是一种非常简单而且有趣的排序算法. 为什么叫地精排序? 地精排序在2000年由Dr. Hamid Sarbazi-Azad 提出的时候被称作 s ...
- Fragment中添加ListView而不使用ListFragment
最初的构想是,将Fragment和ViewPager结合起来, 然后突发奇想,在第一个Fragment里添加了ListView, 依照网上的建议,extends了ListFragment,接着各种报错 ...
- Log4Net根据不同的Logger名称,生成日志文件到不同的地方。
1.定义日志记录类 1: public class Log4NetLogger : ISystemLogger 2: { 3: static log4net.ILog securityLogger = ...
- ASP.NET执行模型之IIS服务器处理流程
之前在网上看过很多对这方面的讲解,但个人觉得看下来过于 "深奥",不容易理解,所以想用更简单的方式进行阐述,便于理解. 本次我们重点分析用户请求到页面呈现过程中Web服务器的处理过 ...
- Java开发之JSP行为
一.Java Bean行文 1.重点说明 Java Bean行为是一组与Java Bean相关的行为,包括useBean行为.setProperty行为.getProperty行为等.Java Bea ...
- 高大上的uGUI正式版发布了
uGUI发布啦 本周期待已久的New UI System 发布了,因为这段时间项目是开发期,所以比较忙,也就没过多关注新UI了,趁着周六日有空,来瞅瞅这高大上的New UI System. PS:我也 ...
- Red5 第一个例子之HelloWorld
http://yerik.blog.51cto.com/1662422/1343993
- Extjs API - JS Duck
1. 安裝JS Duck3 tar.gz版本 https://nodeload.github.com/senchalabs/jsduck/tarball/master exe版本 http://c ...