Метод цепочки в JavaScript - PullRequest
       4

Метод цепочки в JavaScript

3 голосов
/ 05 ноября 2010

Этот рабочий код использует Sproutcore:

person = SC.Object.create({
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: function() {
        return this.get('firstName') + " " + this.get('lastName');
    }.property()

});

console.log(person.get('fullName')); // "Foo Bar"

Интересно, где объявлено свойство () и как они заставили это работать. Когда я пытаюсь восстановить это без класса SC, это дает мне:

TypeError: Object function () {
        return this.get('firstName') + " " + this.get('lastName');
    } has no method 'property'

Как выглядит код, чтобы заставить его работать?

Ответы [ 2 ]

3 голосов
/ 05 ноября 2010

Sproutcore расширяет прототип функции.

Function.prototype.property = function() { /* code here */ };

Конкретный код, используемый sproutcore, равен https://github.com/sproutcore/sproutcore/blob/master/frameworks/runtime/core.js#L908

SC.mixin(Function.prototype, 
//...snip...

property: function() {
    this.dependentKeys = SC.$A(arguments) ;
    var guid = SC.guidFor(this) ;
    this.cacheKey = "__cache__" + guid ;
    this.lastSetValueKey = "__lastValue__" + guid ;
    this.isProperty = YES ;
    return this ;
  },
//snip
);

В их случае они используют собственный метод mixin, но концепция та же: расширение прототипа

1 голос
/ 05 ноября 2010

Предположительно, Sproutcode изменил Function.prototype для включения функции property.

Вы можете просто посмотреть исходный код .

...