2016-06-04 4 views
0

프로토 타입 함수/viewModel 함수를 다른 것보다 선호하는 이유가 있는지 궁금합니다.JavaScript - 프로토 타입 기능 대 ViewModel 기능?

Number.localeSeparator = 1.1.toLocaleString().substr(1, 1); 

Number.prototype.centToEuro = function (separator_string) { 
    if (!separator_string) { 
     separator_string = Number.localeSeparator; 
    } 
    return (this/100).toFixed(2).replace(".", separator_string) + "€"; 
} 

var vm = {myMoney: ko.observable(1234)}; 
ko.applyBindings(vm); 

이것은 매우 쉽게 데이터 바인딩을했다 :

당신이 Number 객체의 프로토 타입 함수를 내가했다 않았다 무엇 12.34€

같은 돈 값으로 정수 1234을 대표 만들고 싶었 말 왜냐하면 내가보기에해야 할 일은 다음과 같았습니다.

<div data-bind="text: myMoney().centToEuro()"></div> 

대신 프로토 타입 functio N, 나는 또한과 같이 거의 동일한 코드와 뷰 모델의 기능을 만들 수 있습니다보기에 사용

var vm = { 
    myMoney: ko.observable(1234), 
    localeSeparator: 1.1.toLocaleString().substr(1, 1), 
    centToEuro: function (value_int, separator_string) { 
     if (!separator_string) { 
      separator_string = vm.localeSeparator; 
     } 
     return (value_int/100).toFixed(2).replace(".", separator_string) + "€"; 
    } 
} 
ko.applyBindings(vm); 

, 그것은 다음과 같을 것이다 :

<div data-bind="text: centToEuro(myMoney())"></div> 

당신이 알 수 있듯이, 두 HTML 행은 거의 동일한 길이이며 접근 방식 만 다릅니다. 그래서 질문은 어떤 접근 방식을 선호합니까?

답변

3

centToEuro이 임의의 숫자와 아무 관련이 없다는 점을 감안하면, 여기서 다루고있는 돈을위한 특정 모델을 가지고 있고 내장 프로토 타입 개체를 확장해서는 안되며 viewmodel 함수로 이동하십시오.

+0

좋아, 의미가 있습니다. 그리고 임의의 숫자에 대해 사용자 지정 함수를 사용하고 싶다면? 프로토 타입을 확장할지 여부를 일반 사례로 설명하거나 사용 사례에 따라 달라질 수 있습니까? – jaySon

+0

그런 경우에도 여전히 일반적으로 [나쁜 생각]으로 간주됩니다 (http://stackoverflow.com/q/10197174/1048572) (여기에있는 주석의 링크도 참조하십시오). – Bergi

1

질문의 의미가 아닌,이 기능을 어디에 두어야합니까?

통화 형식과 같은 작업 (예 : 한 번 설정하여 모든 곳에서 사용)에 대해 Extender를 사용할 것을 고려하십시오. 그냥 예 :

ko.extenders.currency = function (target, option) { 
    target.amount = function() { 
     var amt = ko.unwrap(target); 
     var localeSeparator = 1.1.toLocaleString().substr(1, 1); 
     switch(option) { 
      case "Eur": 
       amt = (amt/100).toFixed(2).replace(".", localeSeparator) + "€"; 
       break; 
      default:; 
      } 
     return amt; 
    }; 
    return target; 
}; 

보기 모델 :

myMoney: ko.observable("1234").extend({currency: "Eur"}) 

마크 업 :

<div data-bind="text: myMoney.amount()"></div> 
+0

이 답변은 실제로 특정 문제에 매우 도움이됩니다. 하지만 제 질문은 실제로 더 나은 관행으로 간주됩니다. (이 경우처럼) 도우미 기능을 위해. MVVM 패턴 (그리고 녹아웃)과는 별도로, 성능, 공간, 안정성 등의 비용을 부담하지 않는 이유 중 하나가 다른 것보다 한 가지 방법을 선호해야하는 이유를 모르겠습니다. – jaySon