Во Флэш существует ряд встроенных объектов, таких как MovieClip, String, Array, Color. Каждый из них имеет свои методы и свойства исчерпывающим образом описанные в руководстве, прилагаемом к программе. Но разве вам никогда не хотелось поиграть с ними в Доктора Франкенштейна? Например, сделать так, чтобы любой мувик получил возможность программного отражения по горизонтали и вертикали, ну что-то типа ball.flipX(). Другими словами, чтобы любой мувик автоматически наследовал ваш flipX() метод.
На самом деле это сделать не просто. А очень просто! Достаточно знать правильный синтаксис, и вы сможете добавлять собственные методы к прототипам встроенных объектов. Например, вот код добавляющий метод flipX() к классу MovieClip:
MovieClip.prototype.flipX = function () { this._xscale = -this._xscale; };
Ухххуу!! Теперь вы можете флипнуть (отразить) любой мувик простым вызовом ВАШЕГО метода:
mc.flipX();
А вот и метод flipY() для сравнения:
MovieClip.prototype.flipY = function () { this._yscale = -this._yscale; };
В общем виде добавление метода к встроенному объекту происходит так:
BuiltinObject.prototype.method = function () { // ну а здесь пошел наш код };
Перезаписываем встроенные методы.
Вы можете не только добавлять новые методы к встроенным объектам, но и перезаписывать уже встроенные методы.
Для перезаписи (переназначения) метода используется тот же синтаксис что и при добавлении нового. Например, метод Array.push() выполняется очень-очень медленно. А мы возьмем и заменим его следующим кодом:
Array.prototype.push = function (data) { this[this.length] = data; };
Вышеупомянутый код используется для добавления data в конец текущего массива. Заметьте, что ключевое слово this используется для обращения к текущему объекту из метода.
Расширение некоторых встроенных объектов отличается от вышеописанного. «Статичные» объекты (Math, Key, Mouse) не имеют прототипированных свойств, поэтому вы должны добавлять методы непосредственно к объекту. Например, вот как вы должны записать функцию Math.distance() для нахождения дистанции между двумя точками:
Math.distance = function (x1, y1, x2, y2) { var dx = x2 - x1; var dy = y2 - y1; return Math.sqrt (dx*dx + dy*dy); };
Вот общий синтаксис:
StaticObject.method = function () { // code };
Не используйте следующий синтаксис:
StaticObject.__proto__.method = function ()
Использование _proto_ в этом контексте добавляет метод к Object.prototype.