这里我说出自己的浅薄的理解,希望大家可以共鸣!

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的更多相关文章

  1. 【第三周读书笔记】浅谈node.js中的异步回调和用js-xlsx操作Excel表格

    在初步学习了node.js之后,我发现他的时序问题我一直都很模糊不清,所以我专门学习了一下这一块. 首先我们来形象地理解一下进程和线程: 进程:CPU执行任务的模块.线程:模块中的最小单元. 例如:c ...

  2. JS中this的指向问题&使用call或apply模拟new

    this的指向由调用时决定而不是定义时决定,定义的方式: //直接定义在函数里 var a="window中的a"; var name="window"; fu ...

  3. JS 中的this指向问题和call、apply、bind的区别

    this的指向问题 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window. function a(){ console.log(this); //输出函数a中的th ...

  4. js中几种实用的跨域方法原理详解(转)

    今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...

  5. js中几种实用的跨域方法原理详解

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  6. js中各种跨域问题实战小结(一)

    什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源策略 ...

  7. js中==, !==, === ,!=的区别

    在讨论比较符的时候我们先要来讨论哈js的类型,这样有助于我们从本质上了解原理. 下面是我找的资料加上个人的总结: js中有5种数据类型:Undefined.Null.Boolean.Number和St ...

  8. 聊一下JS中的作用域scope和闭包closure

    聊一下JS中的作用域scope和闭包closure scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久 ...

  9. js 中的算法题,那些经常看到的

    js中遇到的算法题不是很多,可以说基本遇不到.但面试的时候,尤其是一些大公司,总是会出这样那样的算法题,考察一个程序员的逻辑思维能力.如下: 1.回文. 回文是指把相同的词汇或句子,在下文中调换位置或 ...

随机推荐

  1. CentOS6 Shell脚本/bin/bash^M: bad interpreter错误解决方法

    在windows下保存了一个脚本文件,用ssh上传到centos,添加权限执行nginx提示没有那个文件或目录.shell脚本放到/etc/init.d/目录下,再执行/etc/init.d/ngin ...

  2. ubuntu16.04下vim安装失败

    问题? 重装了ubuntu系统,安装vim出现了以下问题:   sudo apt-get install vim   正在读取软件包列表... 完成 正在分析软件包的依赖关系树        正在读取 ...

  3. ELF Format 笔记(六)—— 字符串表

    ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 字符串表中包含若干以 null 结尾的字符串,这些字符串通常是 symbol 或 section 的名字.当 ...

  4. [转]Java 常用排序算法/程序员必须掌握的 8大排序算法

    本文转自:http://www.cnblogs.com/qqzy168/archive/2013/08/03/3219201.html 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插 ...

  5. UESTC-第五届ACM趣味程序设计竞赛第四场(正式赛)--不完全解题报告

    比赛链接: http://acm.uestc.edu.cn/contest.php?cid=230 A.Police And The Thief ---UESTC 1913 简单博弈,先假设在警察先走 ...

  6. BZOJ4152The Captain[DIjkstra]

    4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 700  Solved: 266[Submit ...

  7. class 函数

    cocos2d-x 3.3 lua 版本的class函数用法: local FightScene = class("FightScene", function() return c ...

  8. Python的高级特性5:谈谈python的动态属性

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性. 看下面一种常见的get/set操作 In [174]: class ...

  9. Debian8.2 下的软件配置

    Add "ll" to alias: ~/.bashrc里面实际上已经有这个alias,把注释去掉就可以了 小红点(指点杆)的启用 这个版本可以在系统配置里把触摸板关掉, 但是这个 ...

  10. delphi附带通用控件安装方法:

    附带通用控件安装方法:----------基本安装1.对于单个控件,Componet-->install component..-->PAS或DCU文件-->install;2.对于 ...