JavaScript - 原型函数与 ViewModel 函数?

JavaScript - Prototype function vs. ViewModel function?

我想知道是否有理由比另一个更喜欢原型函数/viewModel 函数。

假设您想将整数 1234 表示为货币值,例如 12.34€

我所做的是,在 Number 对象上创建一个原型函数:

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);

这使得数据绑定变得相当简单,因为我需要在视图中做的就是:

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

但是除了原型函数,我还可以使用几乎相同的代码创建一个 viewModel 函数,如下所示:

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 线的长度几乎完全相同,只是方法不同。所以问题是,哪种方法更受欢迎?

鉴于 centToEuro 与任意数字无关,而是与您在这里处理的特定货币模型有关,并且您不应扩展内置原型对象,请使用 viewmodel 函数。

你的问题的意思不就是把这个功能放在哪里吗?

考虑使用扩展器来完成货币格式化等任务,一次设置,随处使用。举个例子:

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>