Обратный вызов javascript [дубликат]

Это может быть правдой, что:

  1. Кто-то использует каждую функцию языка / библиотеки, а
  2. . Переключение поведения здесь было бы непродуманным, но

полностью согласуется с обоими вышеперечисленными функциями и по-прежнему делает еще одну точку:

  1. Это запутанная функция, и это несчастливо в Python.

Другие ответы или, по крайней мере, некоторые из них либо делают точки 1 и 2, но не 3, либо делают точки 3 и нижние точки 1 и 2. Но все три являются истинными.

Возможно, что переключение лошадей в середине потока здесь потребует значительного поломки и что может возникнуть больше проблем, связанных с изменением Python, чтобы интуитивно обработать открывающий фрагмент Стефано. И это может быть правдой, что кто-то, кто хорошо знал внутренности Python, мог объяснить минные поля последствий. Однако

Существующее поведение не является Pythonic, а Python успешным, потому что очень мало о языке нарушает принцип наименьшего удивления где-нибудь возле , это плохо , Это настоящая проблема, было бы разумно ее искоренить. Это дефект дизайна. Если вы понимаете язык намного лучше, пытаясь проследить поведение, я могу сказать, что C ++ делает все это и многое другое; вы многому научитесь, перейдя, например, на тонкие ошибки указателя. Но это не Pythonic: людям, которые заботятся о Python достаточно, чтобы упорствовать перед лицом этого поведения, являются люди, которые тянутся к этому языку, потому что у Python гораздо меньше сюрпризов, чем на другом языке. Dabblers и любопытные становятся Pythonistas, когда они удивляются тому, как мало времени требуется, чтобы получить что-то работающее - не из-за дизайна fl - я имею в виду, скрытая логическая головоломка - которая урезает интуицию программистов, которые тянутся к Python потому что он просто работает.

17
задан Phrogz 11 October 2011 в 19:06
поделиться

2 ответа

Конечно, трюк заключается в том, чтобы вернуть объект после его модификации:

String.prototype.foo = function() {
    return this + "+";
}

var str = "Notepad";
console.log(str.foo().foo().toUpperCase());

http://jsfiddle.net/Xeon06/vyFek/

Чтобы сделать этот метод доступным на String, я модифицирую его прототип. Будьте осторожны, чтобы не делать этого на Object, хотя это может вызвать проблемы при перечислении их свойств.

17
ответ дан Alex Turpin 21 August 2018 в 08:32
поделиться
  • 1
    это хорошая идея, по крайней мере, проверить свойство на родных типах перед его добавлением, то есть if ( !('foo' in String.prototype) ) {String.prototype.foo = function() {...} } – keeganwatkins 11 October 2011 в 19:03
  • 2
  • 3
    – Alex Turpin 11 October 2011 в 19:04
  • 4
    Хорошее решение, мое было слишком общим – Andrey 11 October 2011 в 19:04
  • 5
    Вы не можете назначить this в строке. Верните результат вместо этого. Если вам нужно выполнить несколько операций, сохраните их во временной переменной и верните их. Например, var str = this; str += "foo"; return str; – Alex Turpin 11 October 2011 в 19:47

Если я правильно помню, вы можете использовать «это» как контекст функции (объект, к которой она принадлежит) и вернуть ее, чтобы сделать функцию цельной. Другими словами:

var obj = 
{
    f1: function() { ...do something...; return this;},
    f2: function() { ...do something...; return this;}
}

, вы можете связать вызовы, такие как obj.f1().f2()

Имейте в виду, что вы не сможете достичь ожидаемого, вызвав obj .f1 (). toUpperCase () - он выполнит f1 (), вернет «это» и попытается вызвать obj.toUpperCase ().

6
ответ дан Andrey 21 August 2018 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: