Это может быть правдой, что:
полностью согласуется с обоими вышеперечисленными функциями и по-прежнему делает еще одну точку:
Другие ответы или, по крайней мере, некоторые из них либо делают точки 1 и 2, но не 3, либо делают точки 3 и нижние точки 1 и 2. Но все три являются истинными.
Возможно, что переключение лошадей в середине потока здесь потребует значительного поломки и что может возникнуть больше проблем, связанных с изменением Python, чтобы интуитивно обработать открывающий фрагмент Стефано. И это может быть правдой, что кто-то, кто хорошо знал внутренности Python, мог объяснить минные поля последствий. Однако
Существующее поведение не является Pythonic, а Python успешным, потому что очень мало о языке нарушает принцип наименьшего удивления где-нибудь возле , это плохо , Это настоящая проблема, было бы разумно ее искоренить. Это дефект дизайна. Если вы понимаете язык намного лучше, пытаясь проследить поведение, я могу сказать, что C ++ делает все это и многое другое; вы многому научитесь, перейдя, например, на тонкие ошибки указателя. Но это не Pythonic: людям, которые заботятся о Python достаточно, чтобы упорствовать перед лицом этого поведения, являются люди, которые тянутся к этому языку, потому что у Python гораздо меньше сюрпризов, чем на другом языке. Dabblers и любопытные становятся Pythonistas, когда они удивляются тому, как мало времени требуется, чтобы получить что-то работающее - не из-за дизайна fl - я имею в виду, скрытая логическая головоломка - которая урезает интуицию программистов, которые тянутся к Python потому что он просто работает.
Конечно, трюк заключается в том, чтобы вернуть объект после его модификации:
String.prototype.foo = function() {
return this + "+";
}
var str = "Notepad";
console.log(str.foo().foo().toUpperCase());
http://jsfiddle.net/Xeon06/vyFek/
Чтобы сделать этот метод доступным на String
, я модифицирую его прототип. Будьте осторожны, чтобы не делать этого на Object
, хотя это может вызвать проблемы при перечислении их свойств.
Если я правильно помню, вы можете использовать «это» как контекст функции (объект, к которой она принадлежит) и вернуть ее, чтобы сделать функцию цельной. Другими словами:
var obj =
{
f1: function() { ...do something...; return this;},
f2: function() { ...do something...; return this;}
}
, вы можете связать вызовы, такие как obj.f1().f2()
Имейте в виду, что вы не сможете достичь ожидаемого, вызвав obj .f1 (). toUpperCase () - он выполнит f1 (), вернет «это» и попытается вызвать obj.toUpperCase ().
if ( !('foo' in String.prototype) ) {String.prototype.foo = function() {...} }
– keeganwatkins 11 October 2011 в 19:03this
в строке. Верните результат вместо этого. Если вам нужно выполнить несколько операций, сохраните их во временной переменной и верните их. Например,var str = this; str += "foo"; return str;
– Alex Turpin 11 October 2011 в 19:47