title: Are computed observables on prototypes feasible in KnockoutJS?
body: <p>I have an array of items coming back from the service. I'm trying to define a computed observable for every Item instance, so my instinct tells me to put it on the prototype.</p>
  
  <p>One case for the computed observable: the system calculates points, but the user can choose to override the calculated value. I need to keep the calculated value available in case the user removes the override. I also need to coalesce user-assigned and calculated points, and add up the totals.</p>
  
  <p>I'm using mapping to do the following:</p>
  
  <pre><code>var itemsViewModel;
  var items = [
      { 'PointsCalculated' : 5.1 },
      { 'PointsCalculated' : 2.37, 'PointsFromUser' : 3 }
  ];
  
  var mapping = {
      'Items' : {
          create : function(options) {
              return new Item(options.data);
          }
      }
  };
  
  var Item = function(data) {
      var item = this;
      ko.mapping.fromJS(data, mapping, item);
  };
  
  Item.prototype.Points = function () {
      var item = this;
      return ko.computed(function () {
          // PointsFromUser may be 0, so only ignore it if the value is undefined/null
          return (item.PointsFromUser != null) ? item.PointsFromUser : item.PointsCalculated;
      });
  };
  
  ko.mapping.fromJS(items, mapping, itemsViewModel);
  </code></pre>
  
  <p>The way it works now, I have to call the anonymous function to return the computed observable. That appears to create a new instance of the computed observable for each binding, which defeats most of the point of putting it on the prototype. And it's a little annoying having to decipher how many parentheses to use each time I access an observable.</p>
  
  <p>It's also somewhat fragile. If I attempt to access Points() in code, I can't do</p>
  
  <pre><code>var points = 0;
  var p = item.Points;
  if (p &amp;&amp; typeof p === 'function') {
      points += p();
  }
  </code></pre>
  
  <p>because that changes to context of Points() to DOMWindow, instead of item. </p>
  
  <p>If I put the computed in create() in the mapping, I could capture the context, but then there's a copy of the method on each object instance.</p>
  
  <p>I've found Michael Best's Google Groups post (<a href="http://groups.google.com/group/knockoutjs/browse_thread/thread/8de9013fb7635b13" rel="noreferrer">http://groups.google.com/group/knockoutjs/browse_thread/thread/8de9013fb7635b13</a>). The prototype returns a new computed observable on "activate". I haven't figured out what calls "activate" (maybe Objs?), but I'm guessing it still happens once per object, and I haven't a clue what scope 'this' will get.</p>
  
  <p>At this point, I believe I'm past what's available in published docs, but I'm still working up to deciphering what's going on from the source.</p>