JS实现继承的几种方式

一、call()函数和apply()函数

先举个简单的例子

function add(a,b)  
{  
    alert(a+b);  
}  
function sub(a,b)  
{  
    alert(a-b);  
}  

add.call(sub,1,1);

这里的结果是2还是0  ???

先看这里

用猿话来说!!!!

call的用法和意义

  call和apply可以用来重新定义函数的执行环境,也就是this的指向;

  call 和 apply 都是为了改变某个函数运行时的 context

     即上下文而存在的 换句话说,就是为了改变函数体内部 this 的指向。因为 JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。

语法:call(Obj,[arg1][arg1])

用人话来说就是!!!!

就是中间牵线的,sub说 我需要 add 你的方法 和技能,

比如:add会飞天 ,但sub 不会飞,现在sub想飞,但add不让它飞,所以sub就叫来了 call 这个东西, call直接把add爆菊 

加上一个 点 然后把sub抱到括号里,然后 sub 就直接把add 的“飞天”技能学会了

回到函数上来
 1 function add(a,b)  
 2 {  
 3     alert(a+b);  
 4 }  
 5 function sub(a,b)  
 6 {  
 7     alert(a-b);  
 8 }  
 9 
10 add.call(sub,1,1); 
11  //  结果是 sub直接集成了 add 的“飞天”技能  sub alert里面 直接变成了 “a+b”!主角还是sub,并不是add ,你要搞清楚!

所以最后的答案为2

什么时候用到call和apply呢?

1   function changeStyle(attr, value)
2         {     
3             this.style[attr] = value; 
4          }  
5         var box = document.getElementById('box');  
6         window.changeStyle.call(box, "height", "200px");
在这里,changeStyle函数将被box对象调用,this指向了box对象,如果不用call的话,程序报错,因为

window对象中没有style属性。apply的用法:

window.changeStyle.apply(box, [‘height’, ‘200px’]);

现在 window对象 “box” 这个div 的高 直接变成200px了,

window.changeStyle.call(box, “height”, “200px”)

等价于 box.style.height=”200px”;
看了这个写法 你应该明白了把, 啊哈其实 就是写法 和形式不同而已,本质是一样的,apply(),是推进到

数组里而已,也是为了改变this、

这个,也是为了偷 add 的飞天技能哈!

总结一句话:call() 就是用来让括号里的对象 来集成括号外的函数的属性!可以称之为继承!

  之后去面试被面试官问道了这个问题,心中一阵暗喜,but......

面试官:这个其实只是sub把add里面的属性方法复制过来,呢么真正的继承呢?

我:propotype?

博客原址

http://blog.csdn.net/xllily_11/article/details/51480723

想了解更详细的继承,推荐看

http://blog.csdn.net/liuyan19891230/article/details/50774439

http://blog.csdn.net/kkkkkxiaofei/article/details/46474069






原文地址:https://www.cnblogs.com/chwlhmt/p/8422726.html