среда, 13 октября 2010 г.

Call и apply в Javascript

Это методы объекта function. Их суть передавать в нее параметры и переопределять контекст.
Отличие между ними

func_name.call(context,arg1,arg2,...,argN)

var args = [arg1,arg2,...,argN]
func_name.apply(context,args) -- этот метод для удобства, можно в него передавать зарезервированное поле arguments вызывающего объекта(функции).

Это нам позволяет экономить строки написания кода. Определив функционал в одном месте, мы можем его передать в множество следующих объектов без повторного дублирования кода (при этом у каждого будет свой уникальный контекст -- если бы мы использовали прототип, у всех был бы контекст одного объекта, который является для всех прототипом). Вот пример цепочки контрукторов:


function product(name, value)
{
  this.name = name;
  if(value > 1000) 
    this.value = 999; 
  else 
    this.value = value;
}

function prod_dept(name, value, dept)
{
  this.dept = dept;
  product.call(this, name, value);
  this.meth = function(){
    alert("name="+this.name);
    alert("value="+this.value);
    alert("dept="+this.dept);
  }
}

prod_dept.prototype = new product();//зачем в примере это не понятно:)

cheese = new prod_dept("feta", 5, "food");
car = new prod_dept("honda", 5000, "auto");
cheese.meth();
car.meth();


или:

function product()
{
  if(arguments[0]!==undefined && arguments[1]!==undefined){
    this.name = arguments[0];
    if(arguments[1] > 1000)
       this.value = 999;
    else
       this.value = arguments[1];
  }
}
function prod_dept(name, value, dept)
{
  this.dept = dept;
  product.apply(product, arguments);
  this.meth=function(){
    console.log("name="+this.name);
    console.log("value="+this.value);
    console.log("dept="+this.dept);
  }
}

prod_dept.prototype = new product();
cheese = new prod_dept("feta", 5, "food");
car = new prod_dept("honda", 5000, "auto");
cheese.meth();
car.meth();

Если thisArg не передавать, то им будет как обычно обьект поточного окна.

Комментариев нет:

Отправить комментарий