2015-08-18 2 views
1

Я хочу вызвать функцию дважды, но не традиционным способом. Быстрый пример того, что я хотел бы сделать, приведен ниже:Как вызывать одну и ту же функцию повторно?

var myfunc = { 
     copy: function(message){ 
      console.log(message); 
     } 
    } 

    myfunc.copy('hello').copy('world'); 

    // result 'hello' 
    // result 'world' 

Возможно ли это?

+0

Кроме того, если console.log находился в тайм-ауте 1000 мс, как бы он срабатывал в первый раз, подождать секунду, а затем снова запустить его? Вместо того, чтобы стрелять после этой секунды? Почти так же, как не выполнять, пока функция полностью не закончит свой курс полностью. Извините за публикацию в комментариях, но поскольку мой первоначальный вопрос был дан, я не хотел загрязнять исходный вопрос. – user3612986

ответ

3

Да, но вы должны вернуть правильный объект:

var myfunc = { 
    copy: function(message){ 
     console.log(message); 
     return this; 
    } 
}; 
myfunc.copy('hello').copy('world'); 
// hello 
// world 

Этот метод также известен как Method chaining.

+0

Технически это должно быть «метод каскадирования». –

+0

Спасибо raina77ow! Спасибо, проработал! Как только он позволит мне принять ваш ответ, я буду зелёным светом! – user3612986

+0

Кроме того, если console.log находился в тайм-ауте 1000 мс, как бы он срабатывал в первый раз, подождать секунду, а затем снова запустить его? Вместо того, чтобы стрелять после этой секунды? Почти так же, как не выполнять, пока функция полностью не закончит свой курс полностью.Извините за публикацию в комментариях, но поскольку мой первоначальный вопрос был дан, я не хотел загрязнять исходный вопрос. – user3612986

1

Нет, это не сработает, потому что .copy() ничего не возвращает, поэтому вторая .copy() будет вызывать неопределенную ошибку.

Попробуйте это:

var myfunc = { 
    copy: function(message){ 
     console.log(message); 
     return this; 
    } 
} 
0

Это называется метод цепочки. Вот блог, в котором говорится об этом, чтобы вы могли читать и использовать, чтобы ответить на ваш вопрос.

В принципе, вам нужно будет использовать return this;, чтобы вернуть текущий объект, чтобы следующий метод мог его использовать.

// define the class 
var Kitten = function() { 
    this.name = 'Garfield'; 
    this.color = 'brown'; 
    this.gender = 'male'; 
}; 

Kitten.prototype.setName = function(name) { 
    this.name = name; 
    return this; 
}; 

Method chaining in JavaScript

0

Вы должны приковать это, Вы можете также посмотреть на jquerys $ .fn как они создают метод цепочку просто вернуть это, как этот объект является переменной MyFunc и снова используются следующим функция

var myfunc = { 
    copy: function(message){ 
     console.log(message); 
     return this; 
    } 
}; 
myfunc.copy('hello').copy('world'); 
0

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

Вы можете сделать это немного более легко с помощью функции высшего порядка, который мы называем «chainify», который заботится о возвращении this для вас (?):

function chainify(fn) { 
    return function() { 
    fn.apply(this, arguments); 
    return this; 
    }; 
} 

Вы можете chainify свой объект методы различными способами, но вот один:

var myfunc = { 
    init: function() { 
    this.copy = chainify(this.copy); 
    return this; 
    }, 

    copy: function(message){ 
     console.log(message); 
    } 
}.init(); 

Это имеет незначительное преимущество, что каждый метод не нужно быть завален с return this в конце концов, и вы не рискуете забываете Сделай так.

0

Это шаблон дизайна Builder, в котором вы используете каскадные методы. Google, если это поможет.

+0

Собственно, шаблон дизайна строителя - это нечто совсем другое. –

+0

Возможно, здесь контекст может быть неактуальным. но я думал, что он похож на то, что мы видим с шаблоном строителя. Исправьте меня, если я ошибаюсь – Swapnil17

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