2014-08-31 3 views
0

Как должна быть функция «прикован», для того, чтобы вызвать эту функцию, как этотПараметр функции внутри функции

F('Test').custom_substring(0,1); 
+1

он должен вернуть то, что вам нужно использовать после выполнения этой функции. – keune

+0

дополнение к @keune, как вы можете сидеть '' Test ".replace (" T "," "). Replace (" e "," ") ....' потому что 'replace' возвращает строку, которую вы можете назвать буквой , – Mritunjay

+0

@Mritunjay Но как я могу сделать функцию, которую я могу назвать как Value.function – enzian

ответ

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 
+0

Есть ли эквивалент для toString: ..., если у вас есть (как в библиотеках) строка в качестве входных данных и хотите вернуть элемент как «по умолчанию»? – enzian

+0

@ user3744885 Не могли бы вы привести более конкретный пример? Я не уверен, что вы имеете в виду. – JLRishe

+0

Мне нужна функция, которую я вызываю F ('id_of_an_element'), которая возвращает мне параметр document.getElementById() этого параметра, но я все же хочу иметь другие «подфункции», такие как F ('test'). Custom_substring; – enzian

2

Вы должны возвращать объект, который имеет элемент метода с именем 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.

+0

Как вернуть «Test» обратно, если я хочу только вызвать F ('Test'); ? – enzian

+0

@ user3744885 либо добавьте custom_substring в String.prototype, но я бы не советовал ему, потому что это разрушает инкапсуляцию или реализует метод valueOf и toString в возвращаемом объекте. – HMR

-1

Если вы действительно хотите создать цепочку, вам всегда нужно возвращать 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 
+1

WTH - это 'Object.create' хорошо для? Кстати, вам не нужно «возвращать это» от конструктора – Bergi

+0

@Bergi Вы серьезно? Object.create создает объект с прототипом, читает ECMA-262. Для создания эффекта цепной загрузки нужно вернуть это из конструктора. О человек, тебе нужно прочитать много книг. – ghaiklor

+2

Я очень хорошо знаю, что он делает, я пытаюсь сказать вам, что это бесполезно (если не ошибаюсь), где вы его используете. И нет, вам не нужно «возвращать это» из конструкторов. О, чувак, вы должны выбросить свои книги (я пробовал прочитать несколько, но в основном я нашел их посыпанными ошибками). – Bergi

Смежные вопросы