`

js中的call()与apply()方法

    博客分类:
  • js
阅读更多

原文:http://canfly2010.iteye.com/blog/403626

 

  Javascript 中的function本身也是一个object,它本身就会有tostring(),call(),apply()几个附加方法。这个 function.call的意义就在于,当调用时它时,运行时会把它的第一个参数替换掉function的this指向。
call()和apply()是Function object 的两个方法, 它们也可以使一个function作为另一个对象的method来调用用. call()和apply()都需要参数, 而第一个参数就是调用对象, 也就是当function内部出现this时, this所指的对象. call()和apply()的区别在于call()可以传递任意长度参数, 只要第一个参数时调用对象. 而apply只接受两个参数, 需要将除调用对象外的所有参数放入一个数组中。例如:

//定义Book类 
function Book(name, author, page) { 
this.name = name; 
this.author = author; 
this.page = page; 
this.getReader = Book_getReader; 
} 
//定义Book类获取读者的方法 
function Book_getReader() { 
//.... 
} 

function getBooksWithSameAuthor(form, to) { 
var name = this.author; 
var books = ... 
//get books written by name and from year "from" to year "to" 
return books; 
} 

var abook = new Book("JavaScript is Cool", "tom", 514); 
var books = getBooksWithSameAuthor.call(abook, 1990, 2005); 
或 
var books = getBooksWithSameAuthor.apply(abook, [1990, 2005]); 

 当一个function不作为一个对象的method时, JavaScript会认为它是属于一个Globle Object对象的method, 这个Globle Object在Browser中就是window类. 所以从这个角度来说, function和method又可以统一起来了.

Function object 还有一个非常重要的property: prototype. 它是一个predefined的prototype object. 当一个Function用作对象的constructor时, protptype property将发挥作用,中文翻译叫原型. JavaScript的新对象就是通过function的原型来建立的. 同时我们还可以利用prototype来动态的向对象中添加属性, 如:

function Book (name, author, page) { 
this.name = name; 
this.author = author; 
this.page = page; 
} 
var abook = new Book("JavaScript is Cool", "tom", 514); 

Book.prototype.getInfo = getInfo; 
function getInfo() { 
return this.name + " written by " + this.author + " with " + this.page + " pages"; 
} 

alert(abook.getInfo()); 

 这里有一个例子, 用prototype方法来实现callback:

Function.prototype.andThen=function(g) { 
var f=this; 
return function() { 
f();g(); 
} 
}; 

function Manager() { 
this.callback=function () {}; // do nothing 
this.registerCallback=function(callbackFunction) { 
this.callback=(this.callback).andThen(callbackFunction); 
} 
} 

var manager=new Manager(); 
manager.registerCallback(sayHi); 
manager.registerCallback(sayBye); 
manager.callback(); 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics