2012-06-22 3 views
1

Всякий раз, когда я пытаюсь расширить прототип объекта, я получаю сообщение об ошибке:Расширение прототипа объекта в ActionScript 3

Error #1056: Cannot create property my_extension on mx.core.UIComponentDescriptor.

я искал вокруг и нашел эти:

Flash AS3: ReferenceError: Error #1056: Cannot create property

ReferenceError: Error #1056 - instance name Error

Я не использую визуальную среду IDE для разработки сцены, но файлы MXML и AS3, поэтому я не уверен, что делать с этой ошибкой.

Мой код:

Object.prototype.keys = function(): Array { 
    var keys: Array = []; 

    for (var key: * in this) { 
    keys.push(key); 
    } 

    return keys; 
} 

Object.prototype.values = function(): Array { 
    var values: Array = []; 

    for each (var value: * in this) { 
    values.push(value); 
    } 

    return values; 
} 
+1

Отправьте свой код. – Marty

+0

положить код в наручники: объект ["keys"](); , потому что, если вы пишете без нединамического объекта, вы получите ошибку времени компиляции. В любом случае, я бы посоветовал вам, например: создать класс ObjectUtil и внутри функции getKeys, чем использовать ObjectUtil.getKeys (myObject); – turbosqel

ответ

4

Использование prototype расширить класс кажется очень ActionScript 1 или 2.

В AS3, вы можете быть в состоянии прототипа, если класс является динамическим.

Есть отрицательные стороны к прототипу:

  • только динамические классы могут быть расширены, нельзя добавить методы Math, например.
  • Звонки на методы, хранящиеся в прототипе, занимают больше времени для выполнения.
  • Поскольку методы добавляются во время выполнения, редакторы не могут показать их с помощью подсказки кода или использовать правильную подсветку синтаксиса.

Поскольку все классы расширяют объект, нет необходимости явно объявлять Object в качестве базы; Однако, вы можете определить класс AbstractObject быть расширен:

package 
{ 

    public dynamic class AbstractObject extends Object 
    { 

     public function AbstractObject() 
     { 
      super(); 
     } 

     public function get keys():Array 
     { 
      var keys:Array = []; 

      for (var key:* in this) 
      { 
       keys.push(key); 
      } 

      return keys; 
     } 

     public function get values():Array 
     { 
      var values:Array = []; 

      for each (var value:* in this) 
      { 
       values.push(value); 
      } 

      return values; 
     } 

    } 
} 

подтип AbstractObject для своих классов.

+0

Вам нужен расширенный объект? Я думал, что каждый класс был объектом по умолчанию? – Neil

+0

Нет, о чем я говорил в своем ответе. –

+0

+1 так что вы сделали .. – Neil

Смежные вопросы