2

ember.js のドキュメント ( http://emberjs.com/guides/object-model/computed-properties/ ) を見ると、プロパティの使用方法は理解できましたが、オブジェクト宣言でチェーンされたメソッドに出くわしたことはありませんでした。

メソッドがすぐに呼び出されるようにproperty見えますが、そうではないようです。

Person = Ember.Object.extend({
  // these will be supplied by `create`
  firstName: null,
  lastName: null,

  fullName: function() {
    var firstName = this.get('firstName');
    var lastName = this.get('lastName');

   return firstName + ' ' + lastName;
  }.property('firstName', 'lastName')
});

var tom = Person.create({
  firstName: "Tom",
  lastName: "Dale"
});

tom.get('fullName') // "Tom Dale"

小さなjsスニペットを作成すると、ここでは何もしていないようです。 http://jsfiddle.net/xXStr/

var a = {
    what: function() {
        alert ("oh yeah");
    },
    bar: function() {
        alert ("bar");
        return this;
    }.what()
}
a.bar();

オブジェクト宣言でチェーンされたメソッドはどのように機能しますか?

4

1 に答える 1

1

Emberのソース内を見ると、Functionプロトタイプがメソッドを含むように拡張されていることがわかりますproperty

Function.prototype.property = function() {
  var ret = Ember.computed(this);
  return ret.property.apply(ret, arguments);
};

さらにEmber.computed詳しく見ると、が のインスタンスを返すことがわかりますEmber.Computed

Ember.computed = function(func) {
  var args;

  if (arguments.length > 1) {
    args = a_slice.call(arguments, 0, -1);
    func = a_slice.call(arguments, -1)[0];
  }

  var cp = new ComputedProperty(func);

  if (args) {
    cp.property.apply(cp, args);
  }

  return cp;
};

// ...

function ComputedProperty(func, opts) {
  this.func = func;
  this._cacheable = (opts && opts.cacheable !== undefined) ? opts.cacheable : true;
  this._dependentKeys = opts && opts.dependentKeys;
}

Ember.ComputedProperty = ComputedProperty;

したがって、あなたが書くたびに

foo: function() {
  return this.get('bar')
}.property('bar')

実際には無名関数を作成し、すぐにそのpropertyメソッドを呼び出して、 のインスタンスを返していますEmber.ComputedProperty。これがfooプロパティに割り当てられるものです。

于 2013-03-04T18:04:21.623 に答える