Edit This Page

extendObservable

Quite similar to Object.assign, extendObservable takes two or more arguments, a target object and one or more properties maps. It adds all key-value pairs from the properties to the target as observable properties and returns the target object.

var Person = function(firstName, lastName) {
    // initialize observable properties on a new instance
    extendObservable(this, {
        firstName: firstName,
        lastName: lastName
    });
}

var matthew = new Person("Matthew", "Henry");

// add a observable property to an already observable object
extendObservable(matthew, {
    age: 353
});

N.b: observable.object(object) is actually an alias for extendObservable({}, object).

Note that the property maps are not always copied literally onto the target, but they are considered property descriptor. Most values are copied as-is, but values wrapped in a modifier as treated specially. And so are properties that have a getter.

Modifiers

Modifiers can be used to define special behavior for certain properties. For example observable.ref creates an observable reference which doesn't automatically convert its values into observables, and computed introduces a derived property:

var Person = function(firstName, lastName) {
    // initialize observable properties on a new instance
    extendObservable(this, {
        firstName: observable.ref(firstName),
        lastName: observable.ref(lastName),
        fullName: computed(function() {
            return this.firstName + " " + this.lastName
        })
    });
}

An overview of all available modifiers can be found in the modifiers section.

Computed properties

Computed properties can also be written by using a getter function. Optionally accompanied with a setter:

var Person = function(firstName, lastName) {
    // initialize observable properties on a new instance
    extendObservable(this, {
        firstName: firstName,
        lastName: lastName,
        get fullName() {
            return this.firstName + " " + this.lastName
        },
        set fullName(newValue) {
            var parts = newValue.split(" ")
            this.firstName = parts[0]
            this.lastName = parts[1]
        }
    });
}

Note: getter / setter is valid ES5 syntax and doesn't require a transpiler!

extendShallowObservable

extendShallowObservable is like extendObservable, except that by default the properties will not automatically convert their values into observables. So it is similar to calling extendObservable with observable.ref modifier for each property. Note that observable.deep can be used to get the automatic conversion back for a specific property.