Как должна быть функция «прикован», для того, чтобы вызвать эту функцию, как этотПараметр функции внутри функции
F('Test').custom_substring(0,1);
Как должна быть функция «прикован», для того, чтобы вызвать эту функцию, как этотПараметр функции внутри функции
F('Test').custom_substring(0,1);
Следующий пример обеспечивает змеевидные custom_substring
, что не изменяет исходный объект, но вместо возвращает новый. Это похоже на работу jQuery и других библиотек (и как работают встроенные строковые операции), и это помогает сделать более безопасный и более предсказуемый код.
function F(str) {
return {
toString: function() { return str; },
// You didn't provide an example of what you want custom_substring
// to do, so I'll have it append a "!" to the beginning of the resulting value
// (since I can't think of anything else for it to do)
custom_substring: function (from, to) {
return F("!" + str.substring(from, to));
}
};
}
var s1 = F("Hello everyone");
var s2 = s1.custom_substring(0, 7);
var s3 = s2.custom_substring(0, 5)
.custom_substring(0, 4);
console.log(s1); // Hello everyone
console.log(s2); // !Hello e
console.log(s3); // !!!He
Есть ли эквивалент для toString: ..., если у вас есть (как в библиотеках) строка в качестве входных данных и хотите вернуть элемент как «по умолчанию»? – enzian
@ user3744885 Не могли бы вы привести более конкретный пример? Я не уверен, что вы имеете в виду. – JLRishe
Мне нужна функция, которую я вызываю F ('id_of_an_element'), которая возвращает мне параметр document.getElementById() этого параметра, но я все же хочу иметь другие «подфункции», такие как F ('test'). Custom_substring; – enzian
Вы должны возвращать объект, который имеет элемент метода с именем custom_substring. Один из примеров:
var F = function(){
return {
custom_substring:function(){
console.log('custom substring');
return this;
}
}
}
F('Test')
.custom_substring(0,1)
.custom_substring(0,1)
.custom_substring(0,1);
Для создания объектов вы можете использовать функции конструктора и прототип, это сложный вопрос, и объяснили here.
Я бы не стал связываться с String.prototype, потому что это breaks encapsulation.
Если вы действительно хотите создать цепочку, вам всегда нужно возвращать this
из методов, где это возможно.
Например, мы имеем некоторый класс с некоторыми методами:
function Foo() {
this.foo = 'bar';
return this;
}
Foo.prototype = Object.create({
sayFoo: function() {
console.log(this.foo);
return this;
},
getFoo: function() {
return this.foo; // Here you can't make chainload
},
saySmth: function() {
console.log('Something');
return this;
}
});
И мы можем использовать это:
var test = new Foo().sayFoo().saySmth().getFoo(); // prints this.foo -> 'Something' -> returns this.foo
console.log(test); // prints out this.foo
WTH - это 'Object.create' хорошо для? Кстати, вам не нужно «возвращать это» от конструктора – Bergi
@Bergi Вы серьезно? Object.create создает объект с прототипом, читает ECMA-262. Для создания эффекта цепной загрузки нужно вернуть это из конструктора. О человек, тебе нужно прочитать много книг. – ghaiklor
Я очень хорошо знаю, что он делает, я пытаюсь сказать вам, что это бесполезно (если не ошибаюсь), где вы его используете. И нет, вам не нужно «возвращать это» из конструкторов. О, чувак, вы должны выбросить свои книги (я пробовал прочитать несколько, но в основном я нашел их посыпанными ошибками). – Bergi
он должен вернуть то, что вам нужно использовать после выполнения этой функции. – keune
дополнение к @keune, как вы можете сидеть '' Test ".replace (" T "," "). Replace (" e "," ") ....' потому что 'replace' возвращает строку, которую вы можете назвать буквой , – Mritunjay
@Mritunjay Но как я могу сделать функцию, которую я могу назвать как Value.function – enzian