MyTetra Share
Делитесь знаниями!
Классы в Java Script: Вызов родительских методов
Время создания: 05.01.2011 12:05
Текстовые метки: java, script, javascript, call, apply
Раздел: Компьютер - Программирование - Java Script - Классы в JavaScript
Запись: xintrea/mytetra_syncro/master/base/0000003378/text.html на raw.github.com

Вызов родительского конструктора

В механизме наследования, разобранном выше, есть одно белое пятно. Это - конструктор. Хотелось бы, чтобы конструкторы всех родителей вызывались по порядку до конструктора самого объекта.

С наследованием через extend - это очень просто.

Вызов родительского конструктора с теми же аргументами, что были переданы, осуществляется так:

function Rabbit(..) {

...

Rabbit.superclass.constructor.apply(this, arguments)

...

}

Конечно же, аргументы можно поменять, благо apply() дает возможность вызвать функцию с любыми параметрами вместо arguments в примере.

Вызов любых родительских методов

Аналогично можно вызвать и любой другой метод родительского класса. Например, вызов метода run() можно осуществить так:

Rabbit.superclass.run.apply(this, ...)

Что такое apply()

Метод apply очень похож на call, за исключением передачи аргументов. В apply используется массив аргументов вместо списка именованных параметров.

Используя apply, вы можете использовать литеральное объявление массива, например

fun.apply(this, [name, value])

Вы также можете использовать arguments в качестве параметра argArray. Это избавляет от необходимости знать, с какими параметрами была вызвана исходная функция.

Что такое call()

Метод call может применяться для вызова функции в контексте нужного объекта.

Пример. Вызов метода sayName() в контексте разных объектов:

var Animal1 = {name: 'Cat'}

var Animal2 = {name: 'Dog'}

function sayName() {

// this — ссылка на объект, в контексте которого вызвана функция

alert(this.name);

}

sayName.call(Animal1) // выдаст сообщение "Cat"

sayName.call(Animal2) // выдаст сообщение "Dog"

Помимо смены контекста вызова, метод call может передавать в функцию аргументы:

var obj = {attr: 10};

function sum(a, b)

{

alert(this.attr + a + b);

}

sum.call(obj, 5, 2) // выдаст сообщение с результатом "17"

Если контекст вызова не указан, то функция будет выполнятся в контексте объекта window:

window.a = 5

function say() {

alert(this.a);

}

say.call() // выдаст 5

window.a = 5

function say(b) {

alert(this.a + b);

}

say.call(null, 3) // выдаст 8

 
MyTetra Share v.0.65
Яндекс индекс цитирования