У меня есть довольно интересный вопрос о внедрении 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-
Я создал кнопку во 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, поэтому для меня это ошибка.
Я буду держать награду открытой, пока она там. Если я больше ничего не получу, то отдам Шейну.