call() và apply()

2 phương thức hữu dụng của các đối tượng function là call() và apply().

Chúng cho phép các đối tượng mượn các phương thức từ các đối tượng khác và gọi chúng ngay bên trong bản thân chúng.đây là 1 cách rất mạnh mẽ và dễ dàng để giảm thiểu mã code Ta xét ta có 1 đối tượng some_obj object, chứa 1 phương thức say()

var some_obj = {
    name: ‘Ninja’,
    say: function(who) {
          return ‘Haya ‘ + who + ‘, I am a ‘ + this.name;
    }
}
Ta có thể gọi phương thức say() như sau :
>>> some_obj.say(‘Dude’);
“Haya Dude, I am a Ninja”

Giờ ta tạo ra 1 đối tượng đơn giản my_obj, mà chỉ có 1 thuộc tính name :
>>> my_obj = {name: ‘Scripting guru’};

Bên trong đối tượng my_obj không có phương thức say() tuy nhiên ta lại muốn mược phương thức say() này từ đối tượng some_obj vào trong đối tượng my_obj thì ta làm như sau :
>>> some_obj.say.call(my_obj, ‘Dude’);

Nó đã hoạt động.nhưng chuyện gì sẽ xảy ra ? ta gọi phương thức call() của phương thức say() , 2 tham số được chuyển tiếp là đối tượng my_obj và chuỗi ‘Dude’.kết quả khi phương thức say() được gọi, thì có tham chiếu tới đối tượng this, khi này đối tượng this chỉ
tới đối tượng my_obj.do vậy this.name không trả về Ninja nhưng lại trả về

Scripting guru
Nếu ta có nhiều hơn các tham số được chuyển tiếp vào khi gọi phương thức call(), thì cứ việc chuyển tiếp chúng :
some_obj.someMethod.call(my_obj, ‘a’, ‘b’, ‘c’);

nếu ta không chuyển tiếp 1 đối tượng như 1 tham số đầu tiên bên trong call() hay là null, thì đối tượng toàn cục sẽ được giả định phương thức appy() là việc giống với cách của call() nhưng với 1 chút khác biệt là tất cả các tham số mà ta muốn chuyển tiếp vào phương thức của 1 đối tượng khác thì chúng phải được chuyển tiếp như 1 mảng như ví dụ sau :
some_obj.someMethod.apply(my_obj, [‘a’, ‘b’, ‘c’]);

some_obj.someMethod.call(my_obj, ‘a’, ‘b’, ‘c’);

hay như làm trong ví dụ trên :
>>> some_obj.say.apply(my_obj, [‘Dude’]);

“Haya Dude, I am a Scripting guru”