
二、类职责
2.1、observable(普通监控对象类)
observable(他其是一个function)的内部实现:
1.首先声明一个名为observable的fn(这个可以说是一个类)
2.增加一个ko惟一的latestValue(最新值)属性来存储形参传入的值
3.如果支持原生__proto__属性就利用hasOwnProperty来判断属性是否存在的方式来继承,判断__proto__代码(在utils类中)
var canSetPrototype = ({ __proto__: [] } instanceof Array);
4.ko.subscribable的fn属性的init方法对observable进行初始化(主要增加订阅、发布相关属性)
5.observable再继承observabelFn相关属性和方法(observabelFn包含观察、值变化前、值变化后的执行策略)
// Define prototype for observablesvar observableFn = {"equalityComparer": valuesArePrimitiveAndEqual,peek: function() { return this[observableLatestValue]; },valueHasMutated: function () { this["notifySubscribers"](this[observableLatestValue]); },valueWillMutate: function () { this["notifySubscribers"](this[observableLatestValue], "beforeChange"); }};6.返回observable方法的实现(如果传入参数就是设置,无参则是获取)ko.observableArray = function (initialValues) {initialValues = initialValues || [];if (typeof initialValues != "object" || !("length" in initialValues))throw new Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");var result = ko.observable(initialValues);ko.utils.setPrototypeOfOrExtend(result, ko.observableArray["fn"]);return result.extend({"trackArrayChanges":true});};2.3、subscribable(订阅对象类)subscribe: function (callback, callbackTarget, event) {var self = this;event = event || defaultEvent;var boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback;var subscription = new ko.subscription(self, boundCallback, function () {ko.utils.arrayRemoveItem(self._subscriptions[event], subscription);if (self.afterSubscriptionRemove)self.afterSubscriptionRemove(event);});if (self.beforeSubscriptionAdd)self.beforeSubscriptionAdd(event);if (!self._subscriptions[event])self._subscriptions[event] = [];self._subscriptions[event].push(subscription);return subscription;}3.extend:此方法用于添加extends方法加入的扩展类(如observableArray.changeTracking扩展类)function applyExtenders(requestedExtenders) {var target = this;if (requestedExtenders) {ko.utils.objectForEach(requestedExtenders, function(key, value) {var extenderHandler = ko.extenders[key];if (typeof extenderHandler == "function") {target = extenderHandler(target, value) || target;}});}return target;}2.5、observableArray.changeTracking(扩展监控对象的一个具体实现)