javascript继承机制 & call apply使用说明
一、继承机制
1、对象冒充:构造函数使用 this 关键字给所有属性和方法赋值,可使 ClassA 构造函数成为 ClassB 的方法,然后调用它。
function ClassZ() {
    this.newMethod = ClassX;
    this.newMethod();
    delete this.newMethod;
    this.newMethod = ClassY;
    this.newMethod();
    delete this.newMethod;
}
这里存在一个弊端,如果存在两个类 ClassX 和 ClassY 具有同名的属性或方法,ClassY 具有高优先级。因为它从后面的类继承。除这点小问题之外,用对象冒充实现多重继承机制轻而易举。
2、apply()、 call() 方法是与经典的对象冒充方法最相似
function ClassB(sColor, sName) {
    //this.newMethod = ClassA;
    //this.newMethod(color);
    //delete this.newMethod;
    ClassA.call(this, sColor);
    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}
3、原型链
function ClassA() { }
ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
    alert(this.color);
};
function ClassB() { }
ClassB.prototype = new ClassA();
Object.extend = function(destination, source) {
    for (property in source) {
        destination[property] = source[property];
    }
    return destination;
}
除此之外,还有种方法,就是:Function.apply或者Function.call。 通过 call() 或 apply() 方法可以设置 this 的值, 且作为已存在对象的新方法调用。
使用场景:
1、 arguments 转换为数组
// 返回的是数组,但是arguments本身保持不变
vararg=[].slice.call(arguments);
//[].slice.call(document.getElementsByTagName('li'));
2、借用
var foo = {
    name: 'joker',
    showName: function() {
        console.log(this.name);
    }
}
var bar = {
    name: 'rose'
}
foo.showName.call(bar);    
3、继承
var Student = function(name, age, high) {
     // use call
     Person.call(this,name,age);
     this.high=high;
}
Person.apply(this,arguments);
this:在创建对象在这个时候代表的是student
arguments:是一个数组,也就是[“qian”,”21”,”一年级”];
用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面
4、 封装对象时保证this的指向
var _this = this;
_this.$box.on('mousedown', function() {
return _this.fndown.call(_this);
})
5、代码优化
返回数组最大值
alert(Math.max(,)) //
alert(Math.max(,,,,,)) //
alert(Math.max([,,,])) // 找出数组中最大的元素,这样却是不行的。 function getMax(arr){
var arrLen=arr.length;
for(var i=,ret=arr[];i<arrLen;i++){
ret=Math.max(ret,arr[i]);
}
return ret;
} //这样写麻烦而且低效。如果用 apply呢
function getMax2(arr){
return Math.max.apply(null,arr);
}
//两个数组拼接,要把 arr2展开,然后一个一个追加到arr1中去
var arr1=[,,];
var arr2=[,,];
arr1.push(arr2)//[1,3,4,[3,4,5]]显然不行
//只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)
var arrLen=arr2.length
for(var i=;i<arrLen;i++){
arr1.push(arr2[i]);
}
//使用apply,arr1执行push方法,arr2作为参数传入。arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合
Array.prototype.push.apply(arr1,arr2)
function add(a, b){console.dir(this);}
function sub(a, b){console.dir(this);}
add(,); //"Window"
sub(,); //"Window"
add.call(sub, , ); //"sub(a, b)"
sub.apply(add, [, ]); //"add(a, b)"
javascript继承机制 & call apply使用说明的更多相关文章
- 【JavaScript】重温Javascript继承机制
		
上段时间,团队内部有过好几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了些口语化的描述,留作备案. 一.讲个故事吧 澄清在先,Java和Javascript是雷锋和雷峰塔的关系.Ja ...
 - javascript继承机制的设计思想(ryf)
		
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
 - 转:Javascript继承机制的设计思想
		
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
 - Javascript继承机制的设计思想
		
转自:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.htm ...
 - Javascript继承机制总结 [转]
		
转自:http://bbs.csdn.net/topics/260051906 Javascript继承 一直想对Javascript再次做一些总结,正好最近自己写了一个小型Js UI库,总结了一下J ...
 - javascript 继承机制设计思想
		
作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_java ...
 - JavaScript 继承机制小记
		
读<JavaScript: the good parts>, 关于对象继承这块小记一笔: function Base(v){ this.baseValue = v; this.getBas ...
 - Javascript继承机制的设计
		
写软工作业时各种蛋疼:主要在于Javascript没有“子类”“父类”“接口”的概念,只能使用prototype来实现,看了下面一篇文章,感觉写得很不错~ http://www.ruanyifeng. ...
 - Javascript prototype 及 继承机制的设计思想
		
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
 
随机推荐
- window.open居中显示
			
window.open中会发现怎么打开的浏览器窗口怎么不在正中间,而且还比较随性,那不是逼死强迫症患者了,所以查了一下资料始终打开的窗口能显示在正中间,下面是js中的代码分享 // url 转向网页的 ...
 - ubuntu搭建eclipse+svn
			
最近工作中要求使用ubuntu系统进行开发,小编第一次使用,将搭建环境的过程中一点点经验分享给大家.ubuntu的使用跟linux差不太多,大多数命令还是一样的.不过界面要好看很多,O(∩_∩)O哈哈 ...
 - [CLR via C#]值类型的装箱和拆箱
			
我们先来看一个示例代码: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Array ...
 - C语言100例02   PHP版(练习)
			
问题: 企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万到 ...
 - ASP.NET MVC4计划任务实现方法(定时执行某个功能)
			
系统中定时执行某个任务是比较常用的功能,如一个部门定期向上级部门上报数据是一个典型的例子,下面就简单说说在.net mvc中如何实现定时执行某个功能的方法. 1.首先修改Glocal.asax文件,在 ...
 - 2.StringBuffer:线程安全的可变字符串序列
			
一.String.StringBuffer和StringBuilder的区别 1.String是内容不可变的,而StringBuffer和StringBuilder都是内容可变的. 2.StringB ...
 - bsxfun函数
			
函数功能:两个数组间元素逐个计算的二值操作 使用方法:C=bsxfun(fun,A,B) 两个数组A合B间元素逐个计算的二值操作,fun是函数句柄或者m文件,也可以为如下内置函数: @plus 加@m ...
 - hadoop 使用map将SequenFile里的小文件解压出来
			
上例中将HDFS里小文件通过mapper压缩到一个文件中,本例将这些小文件解压出来. mapreduce可以按SequenceFile的key进行分片. 1.mapper public class M ...
 - [洛谷P1341]无序字母对
			
题目大意:给一张无向图,找一条字典序最小的欧拉路径 题解:若图不连通或有两个以上的奇数点,则没有欧拉路径,可以$dfs$,在回溯时把这个节点加入答案 卡点:没有在回溯时加入答案,导致出现了欧拉路径没走 ...
 - 自学Python快速入门
			
1 helloworld#基本语法print("hello") #换行print('1221312\12312312\2312312321312\21312312') ##表示注释 ...