淘汰原型问题

时间:2017-05-12 05:52:24

标签: javascript knockout.js prototype knockout-components

我想理解为什么当属性是原型时,knockout的行为会有所不同,尤其重要的是,如何避免它,同时仍然使用原型。我想要覆盖一些方法,因为我有一个我们要继承的基本视图模型

以下说明了我的意思

JSFIDDLE WITH PROTOTYPE [try typing into the first input box and it will appear in the other]

var viewModel = function(params) {
        this.params =  params;
    };
    viewModel.prototype.text = ko.observable(this.params  && this.params.initialText || '');


ko.components.register('message-editor', {
    viewModel: viewModel,
    template: 'Message: <input data-bind="value: text" /> '
            + '(length: <span data-bind="text: text().length"></span>)'
});
 
ko.applyBindings();
<!-- ko component: "message-editor" -->
<!-- /ko -->
<br />
<!-- ko component: "message-editor" -->
<!-- /ko -->


<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

JSFIDDLE WITHOUT PROTOTYPE [try typing into the first input box and it will not appear in the other]

var viewModel = function(params) {
        this.params =  params;
        this.text = ko.observable(this.params  && this.params.initialText || '');
    };


ko.components.register('message-editor', {
    viewModel: viewModel,
    template: 'Message: <input data-bind="value: text" /> '
            + '(length: <span data-bind="text: text().length"></span>)'
});
 
ko.applyBindings();
<!-- ko component: "message-editor" -->
<!-- /ko -->
<br />
<!-- ko component: "message-editor" -->
<!-- /ko -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

他们为什么表现不同?

1 个答案:

答案 0 :(得分:5)

在JavaScript中,原型仅用于该类型的每个对象共有的函数。所有实例都可以共享该函数的同一副本,因为该函数在被调用时通过this获取对实例对象的引用。 Knockout observables不是存储在原型中的,因为它们存储特定于对象实例的数据。