can-observe
Version:
Like can.Map, but without the .attr method.
66 lines (54 loc) • 2.49 kB
JavaScript
;
var canReflect = require("can-reflect");
var canSymbol = require("can-symbol");
var makeObserve = require("../src/-make-observe");
var eventMixin = require("can-event-queue/map/map");
var typeEventMixin = require("can-event-queue/type/type");
var helpers = require("../src/-helpers");
var makeObject = require("../src/-make-object");
var observableStore = require("../src/-observable-store");
var definitionsSymbol = canSymbol.for("can.typeDefinitions");
var computedHelpers = require("../src/-computed-helpers");
var typeHelpers = require("../src/-type-helpers");
// Setup proxyKeys to look for observations when doing onKeyValue and offKeyValue
var proxyKeys = helpers.assignEverything({},makeObject.proxyKeys());
computedHelpers.addKeyDependencies(proxyKeys);
// ## ObserveObject constructor function
// Works by returning the proxy-wrapped instance.
var ObserveObject = function(props) {
var prototype = Object.getPrototypeOf(this);
computedHelpers.ensureDefinition(prototype);
typeHelpers.ensureDefinition(prototype);
// Define expando properties from `can.defineInstanceProperty`
var sourceInstance = this;
var definitions = prototype[definitionsSymbol] || {};
for (var key in definitions) {
Object.defineProperty(sourceInstance, key, definitions[key]);
}
// Add properties passed to the constructor.
if (props !== undefined) {
canReflect.assign(sourceInstance, props);
}
// Create a copy of the proxy keys
var localProxyKeys = Object.create(proxyKeys);
// Make sure that the .constructor property isn't proxied. If it was,
// `this.constructor` would not be the type.
localProxyKeys.constructor = this.constructor;
// Wrap the sourceInstance
var observable = makeObject.observable(sourceInstance, {
observe: makeObserve.observe,
proxyKeys: localProxyKeys,
shouldRecordObservation: typeHelpers.shouldRecordObservationOnAllKeysExceptFunctionsOnProto
});
// Add the proxy to the stores.
observableStore.proxiedObjects.set(sourceInstance, observable);
observableStore.proxies.add(observable);
return observable;
};
eventMixin(ObserveObject.prototype);
typeEventMixin(ObserveObject);
computedHelpers.addMethodsAndSymbols(ObserveObject);
typeHelpers.addMethodsAndSymbols(ObserveObject);
// Allows this to be extended w/o `class`
ObserveObject.extend = helpers.makeSimpleExtender(ObserveObject);
module.exports = ObserveObject;