2013-03-04 5 views
2

Глядя на документацию ember.js (http://emberjs.com/guides/object-model/computed-properties/) Я понимаю, как использовать свойства, но раньше не сталкивался с цепочками методов в объявлении объекта.свойства ember и javascript chaining

Мне кажется, что метод 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(); 

Как работают цепные методы в декларации объекта?

ответ

1

Если вы заглянете внутрь Ember source, вы обнаружите, что прототип Function распространяется на метод property.

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

Looking deeper, мы видим, что 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.

Смежные вопросы