这篇文章主要为大家详细介绍了 JavaScript 函数的调用模式,包括方法调用模式,构造器调用模式,apply/call 调用模式,感兴趣的小伙伴们可以参考一下
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
我们说一个函数的调用模式是作为一个函数来调用,是要与其它三种调用模式做区分
函数其他的三种调用: 方法调用模式,构造器调用模式,apply/call 调用模式。
方法的调用模式:
- var obj={
- fun1: function(){
- //方法内容
- this; //指的是window
- }
- }
- obj.fun1() //方法的调用
构造器的调用:
- function Person(name, age, job){
- this.name = name;
- this.age = age;
- this.job = job;
- this.sayName = function(){
- alert(this.name);
- };
- }
- var person1 = new Person("Nicholas", 29, "Software Engineer");
- var person2 = new Person("Greg", 27, "Doctor");
apply/call 调用模式:
- function cat(){}
- cat.prototype = {
- food: "fish",
- say: function(){
- alert("I love " + this.food);
- }
- };
- var blackCat = new cat;
- blackCat.say();
这里如果没有显性的 return 语句,这个新的对象则会被隐式的 return,并成为这个构造器的值。 也就是说这里可以等价于: var blackCat = new cat();
但是如果我们有一个对象
- var whiteDog = {
- food: "bone"
- };
我们不想对它重新定义 say 方法,那么我们可以通过 call 或 apply 用 blackCat 的 say 方法:
blackCat.say.call(whiteDog);
所以,可以看出 call 和 apply 是为了动态改变 this 而出现的,当一个 object 没有某个方法,但是其他的有,我们可以借助 call 或 apply 用其它对象的方法来操作。
用的比较多的,通过 document.getElementsByTagName 选择的 dom 节点是一种类似 array 的 array(arguments 等等)。它不能应用 Array 下的 push,pop 等方法。我们可以通过:
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));
这样 domNodes 就可以应用 Array 下的所有方法了。
来源: http://www.phperz.com/article/17/0307/263663.html