Function.prototype.bind

У меня есть довольно интересный вопрос о внедрении EcmaScript-5 Function.prototype.bind. Обычно при использовании bind вы делаете этот путь:

var myFunction = function() {
    alert(this);
}.bind(123);

// will alert 123
myFunction();

Хорошо, так что это круто, но что должно произойти, когда мы это сделаем?

// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... 123!
myFunction();

Я понимаю, что это вполне логичное поведение с точки зрения того, как Function.prototype.bind реализован ( https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind ). Но в реальных жизненных условиях это совершенно бесполезное поведение, не так ли? Вопрос в том: это ошибка или особенность? Если это жучок, почему он нигде не упоминается? Если это функция, то почему тогда Google Chrome с нативной реализацией «bind» ведет себя абсолютно так же?

Чтобы было понятнее, что, на мой взгляд, имело бы больше смысла, вот фрагмент кода, который реализует Function.prototype.bind немного по-другому:

if (!Function.prototype.bind) {
    Function.prototype.bind = function() {
        var funcObj = this;
        var original = funcObj;
        var extraArgs = Array.prototype.slice.call(arguments);
        var thisObj = extraArgs.shift();
        var func = function() {
            var thatObj = thisObj;
            return original.apply(thatObj, extraArgs.concat(
                Array.prototype.slice.call(
                    arguments, extraArgs.length
                )
            ));
        };
        func.bind = function() {
            var args = Array.prototype.slice.call(arguments);
            return Function.prototype.bind.apply(funcObj, args);
        }
        return func;
    };
}

Так что теперь попробуйте так:

// rebind binded function
myFunction = myFunction.bind('foobar');
// will alert... "foobar"
myFunction();

На мой взгляд, замена «this» имеет больше смысла...

Так что вы думаете об этом?

-121--770243-

Проблема с именами экземпляров внутри Button Я создал кнопку во Flash, и внутри у меня есть TextField и MovureClip, оба с именами экземпляров установлены. Они охватывают все 4 кадра кнопки, без ключевых кадров. Я обнаружил, что не могу получить доступ...

Я создал кнопку во Flash, и внутри нее есть TextField и MoveyClip, оба с заданными именами экземпляров. Они охватывают все 4 кадра кнопки, без ключевых кадров.

Я обнаружил, что не могу получить доступ к объектам, используя имена экземпляров, которые я установил, поэтому я использовал этот фрагмент кода, чтобы увидеть, что происходит:

var obj:DisplayObject = this.m_graphics.btnChange.upState;
for ( var i:int = 0; i < obj.numChildren; i++ )
{
    trace( "We have an object at " + i + " - " + obj.getChildAt( i ) + ": " + obj.getChildAt( i ).name );
    var t:TextField = obj.getChildAt( i ) as TextField;
    if ( t == null )
        continue;

    trace( "  The textfield has text '" + t.text + "' );
}

Я получаю это как вывод:

We have an object at 0 - [object Shape]: instance195
We have an object at 1 - [object TextField]: instance199
  The textfield has text 'Change'
We have an object at 2 - [object MovieClip]: instance203

Таким образом, они TextField и MovureClip есть, они только что вернули свои имена экземпляров в общий «instance # #».

Кто-нибудь знает, в чем проблема? Если я делаю кнопку MovureClip, она работает нормально (хотя я должен сам управлять кадрами).

Я знаю о различных методах, которые я мог бы использовать для работы с этим, но это означает изменение многих вещей, и я хотел бы знать, почему SimpleButton игнорируют имена экземпляров, набор в Flash

EDIT

. кажется, что, несмотря на отсутствие ключевых кадров в кнопке в Flash IDE, Flash создает 4 экземпляра каждого предмета (трассировка через upState , например, даст мне TextField с именем экземпляра «instance2», в то время как в downState имя экземпляра - «instance4»). Если я изменяю текст в одном состоянии, он не отражается в других.

Я думаю, что когда Flash создает объекты, он не копирует все свойства должным образом (а именно имя экземпляра)

EDIT

Я согласен с тем, что ответ Шейна является обходным - я бы сам сказал, что я знаю о различных методах обойти проблему -но он игнорирует проблему, не решает ее (это единственная причина, почему я ее не принял). Я пришел в SO в первую очередь, чтобы узнать, кто-то, возможно, знает, почему это происходит в первую очередь (tbh, это кажется ошибкой в SDK).

Я также понимаю рассуждения, лежащие в основе аргумента "вы не должны обращаться к детям в SimpleButton; если вы хотите больше управления, используйте Sprite или MoveyClip ", но я не согласен с ним. Flash IDE позволяет создавать кнопки с именованными экземплярами внутри них, а документы SimpleButton предоставляют доступ к различным состояниям, поэтому для меня это приемлемое поведение. Если SimpleButton можно использовать только для очень простых, неизменяемых статических кнопок (подумайте о локализации), то это бесполезно. Вы можете использовать Sprite и MovureClip, но затем вы должны сами управлять различными состояниями, что становится неловко. У меня есть собственный класс Button для работы с шаблоном, но мне не нужно переписывать основные функциональные возможности SDK, поэтому для меня это ошибка.

Я буду держать награду открытой, пока она там. Если я больше ничего не получу, то отдам Шейну.

5
задан divillysausages 5 September 2011 в 09:49
поделиться