Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
O.o() — мощное нововведение для web платформы, которое вы можете использовать уже сегодня.
Мы надеемся, что это функциональность вскоре появится и в других браузерах, позволяя JavaScript фреймворкам получить некий выигрыш в производительности с новыми нативными возможностями объектов и наблюдением за ними. Помимо Chrome 36, эта функциональность так же будет доступно в ближайшем релизе Opera.
// Наблюдаем за thingy(простите, язык не повернется писать «наблюдаем за рюшечками»)
Кстати изображения без перевода вас не смущают?
Object.[add/remove]Observer Object.[lock/unlock]Observers которые добавляют ака proxy функции для сеттеров и ака breadcrumbs proxies для вложенных обьектов, как с примера для полимера.var obj = { foo: { bar: 'baz' } };
Object.addObserver(obj, 'foo.bar', console.log.bind(console));
obj.foo.baz = 'qux';
//> qux
obj.foo = { bar: 'quxx' }
//> quxx
var model = require('moco').model;
var User = model()
.attr('_id', { primary: true }) // this attribute will be used as primary key
.attr('name') // just simple attribute
.attr('email', { get: function() {
return this.name + '@example.com';
}}) // this is a getter and it called each time you try access this model
.attr('title', { default: 'Unknow' })// this will be used to fill undefined attribute while creation
var u1 = new User({ _id: 1, name: 'den'});
console.log(u1._id); // 1
console.log(u1.primary); // 1
console.log(u1.email); // den@example.com
console.log(u1.title); // Unknow
u1.name = 'daniel';
console.log(u1.email); // daniel@example.com
Даже со стороны наблюдателя, вы не хотите, чтобы какая-то сторонняя функция была вызвана из середины текущей функции и т.п. Несогласованность и разобщенность мест вызовов функций раздражает, верно? И прибавьте к этому ещё проверки на ошибки, и прочие ситуации, которые могут усложнить жизнь при данном подходе. И в результате мы видим, что с подобной моделью реально трудно работать. Асинхронный подход сложнее в понимании, но всё же, на сегодняшний день, ничего лучше него нет.
Как я описал выше — будут лишние вызовы обработчиков
var model = {
foo: 1
};
Object.observe(model, function(changes) {
changes.forEach(function(change) {
if (change.type === "update" && change.name === "foo") {
console.log(change.type, change.name, change.oldValue);
}
});
});var model = {
foo: 1
};
Object.observe(model.foo, function(ev) {
if (ev.type === 'update') {
console.log(ev.type, ev.name, ev.oldValue);
}
});
var obj = { foo: { bar: 'baz' } };
var observer = new PathObserver(obj, 'foo.bar', ['update']);
observer.open(function(newValue, oldValue) {});
Революция дата-байндинга с Object.Observe()