Underscore: _.wrap์€ ์ธ์ˆ˜๋กœ ๋ž˜ํ•‘ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2013๋…„ 03์›” 09์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jashkenas/underscore

์˜ค๋Š˜์€ ๋ฐ‘์ค„๊ณผ ๋ฐฑ๋ณธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ๋ช‡ ๊ฐ€์ง€ ํ•จ์ˆ˜๋ฅผ ๋ž˜ํ•‘ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. underscorejs.org์—์„œ ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

var hello = function (name) {return "hello :"+ name; };
hello = _.wrap (hello, function (func) {
return "before,"+ func ( "moe") + ", after";
});
์•ˆ๋…•ํ•˜์„ธ์š”();
=> 'before, hello : moe, after'

๋‘ ๋ฒˆ์งธ ๋งˆ์ง€๋ง‰ ์ค„์—
ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉด
hello ( "umar");
๋‚˜๋Š” ๋…ผ์Ÿ์ด ์™ธ๋ถ€์—์„œ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

question

๋ชจ๋“  8 ๋Œ“๊ธ€

Wrap์€ ์ด๋ฏธ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋žฉ์˜ ์†Œ์Šค๋Š” ์ฝ์„ ์ˆ˜์žˆ๋Š” ๋งค์šฐ ์งง์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์•„๋ž˜์˜ ํ™•์žฅ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var greet = function(name, language){
  var response
  if (language === "sp") {
    response = "Hola"
  } else if (language === "fr") {
    response = "Bonjour"
  } else {
    response = "Hello"
  }
  return response + " " + name
}
greet("Ted", "fr"); // => "Bonjour Ted"
greet = _.wrap(greet, function(old_greet, lang){ return old_greet("Ted", lang); } );
greet("sp"); // => "Hola Ted"

๋น ๋ฅธ ์‘๋‹ต์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋งค์šฐ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฐฑ๋ณธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
view.js
var view = Backbone.View.extend ({

authorizeCreateAction : ํ•จ์ˆ˜ () {
// ์—ฌ๊ธฐ์„œ "this"๋Š”๋ณด๊ธฐ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.
this.createAlert : _.wrap (this.createAlert, function (_createAlert, _type) {
// ์ƒ์„ฑ ์ž‘์—… ์Šน์ธ
return _createAlert (_type);
});
},
createAlert : function (type) {
//๋ฌธ์ œ:
// ์—ฌ๊ธฐ์„œ "this"๋Š” [window global]์„ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.
}
});
createAlert ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœ ํ•  ๋•Œ createAlert ํ•จ์ˆ˜ ๋‚ด๋ถ€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.๋ณด๊ธฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ž˜ํผ ํ•จ์ˆ˜๋ฅผ โ€‹โ€‹์ž‘์„ฑํ–ˆ์„ ๋•Œ [window global]์„ ๊ฐ€๋ฆฌ ํ‚ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
"๋ณด๊ธฐ"๋ฅผ ๊ฐ€๋ฆฌ ํ‚ค๋„๋ก ์ฐธ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐ‘์ค„์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธ์ด ๊ด€๋ จ์ด ์—†์œผ๋ฉด ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค.
BTW ๋ฐ‘์ค„์€ ๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค

์•„๋ž˜์™€ ๊ฐ™์€ ์ปจํ…์ŠคํŠธ๋กœ _createAlert ๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. :)

return _createAlert.call(this, _type);

๋ฐ‘์ค„ _wrap์€ ํ•˜๋‚˜์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

fn = (function (fn, before, after, self) {
return function () {
if (before) before.apply (self, arguments);
var res = fn.apply (self, arguments);
if (ํ›„) after.apply (self, arguments);
๋ฐ˜ํ™˜ ํ•ด์ƒ๋„;
}
}) (fn, ์ด์ „, ์ดํ›„, this)

ํ•ด๋‹น zarehb์— ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

tnx megawac, partial์€ ์ด์ „ ๋ฐ ์ดํ›„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ์ธ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์ฑ„์šฐ๋Š” ๋ฐ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋žฉ์€ _.partial fyi๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

fn = _.partial(function(fn, before, after, self) {
    var args = _.rest(arguments, 4);
    if (before) before.apply(self,args);
    var res = fn.apply(self,args);
    if (after) after.apply(self,args);
    return res;
})(fn, before, after, this )

๊ทธ๊ฒƒ์€ ์ •ํ™•ํ•˜๊ณ  ์ž‘๋™ํ•˜์ง€๋งŒ, ๋ˆ„๊ตฌ๋“ ์ง€ ์ˆœ์ˆ˜ํ•œ js ์†”๋ฃจ์…˜์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํŠนํžˆ ๋ฐ‘์ค„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ด ๊ฒฝ์šฐ ์–ด๋–ค ์ด์ ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰