Skip to content

Instantly share code, notes, and snippets.

@SerafimArts
Created September 29, 2015 12:45
Show Gist options
  • Save SerafimArts/650b43d830d021ae7c2e to your computer and use it in GitHub Desktop.
Save SerafimArts/650b43d830d021ae7c2e to your computer and use it in GitHub Desktop.
ES Example (ES6 Symbol + ES7 Decorators + ES7 Object properties)
import Observable from "Observable";
class AuthController {
@Observable
user = null;
@Observable
isAuth = false;
constructor() {
// Update isAuth if user variable exists
this.user.after(value => this.isAuth = value instanceof User);
// Remove user if isAuth == false
this.isAuth.after(value => {
if (!value) { this.user = null; }
});
}
loginAs(user) {
this.user = user;
}
logout() {
this.isAuth = false;
}
}
/**
* ObservablePrimitive instance
*/
class ObservablePrimitive {
/**
* @constructor
* @param value
*/
constructor(value = null) {
this.events = {
before: [],
after: [],
all: []
};
Object.defineProperty(this, '$value', {
enumerable: false,
value: value
});
}
/**
* @param value
* @return void
*/
set value(value) {
var exists = typeof value !== "undefined" && value !== null;
var oldValue = this.$value;
if (exists) {
this.events.before.forEach((c) => c(oldValue));
this.$value = value;
this.events.all.forEach((c) => c(oldValue, value));
this.events.after.forEach((c) => c(value));
}
}
/**
* Return value
* @return {*}
*/
get value() {
return this.$value;
}
/**
* @param callback
* @returns {ObservablePrimitive}
*/
after(callback) {
this.events.after.push(callback);
return this;
}
/**
* @param callback
* @returns {ObservablePrimitive}
*/
before(callback) {
this.events.before.push(callback);
return this;
}
/**
* @param callback
* @returns {ObservablePrimitive}
*/
subscribe(callback) {
this.events.all.push(callback);
return this;
}
/**
* @returns {*}
*/
toString() {
return this.value;
}
/**
* @returns {*}
*/
[Symbol.toPrimitive]() {
return this.value;
}
}
/**
* Observable decorator
*
* @param target
* @param key
* @param descriptor
* @returns {{enumerable, get, set}}
* @constructor
*/
export default function Observable(target, key, descriptor) {
return (function (descriptor) {
var value = descriptor.initializer();
var property = new ObservablePrimitive(value);
return {
enumerable: true,
get: () => property,
set: (value) => property.value = value
};
})(descriptor);
}
@SerafimArts
Copy link
Author

@trikadin, это конечно круто, но код по-моему нафига не читаем. Используй нормальное ооп, раз боженька (мозилла и ко) в ES6 его дал =)

@trikadin
Copy link

trikadin commented Oct 6, 2015

А что не читаемо-то? О_о

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment