Определить, является ли свойство объекта ko.observable

Я использую KnockoutJS версия 2.0.0

Если я просматриваю все свойства объекта, как я могу проверить, является ли каждое свойство ko.observable? Вот что я пробовал до сих пор:

    var vm = {
        prop: ko.observable(''),
        arr: ko.observableArray([]),
        func: ko.computed(function(){
            return this.prop + " computed";
        }, vm)
    };

    for (var key in vm) {
        console.log(key, 
            vm[key].constructor === ko.observable, 
            vm[key] instanceof ko.observable);
    }

Но пока все неверно.

Ответ 1

Нокаут включает функцию, называемую ko.isObservable(). Вы можете назвать это как ko.isObservable(vm[key]).

Обновление от комментария:

Вот функция, чтобы определить, является ли что-то вычислимым наблюдаемым:

ko.isComputed = function (instance) {
    if ((instance === null) || (instance === undefined) || (instance.__ko_proto__ === undefined)) return false;
    if (instance.__ko_proto__ === ko.dependentObservable) return true;
    return ko.isComputed(instance.__ko_proto__); // Walk the prototype chain
};

UPDATE: если вы используете KO 2.1+, вы можете напрямую использовать ko.isComputed.

Ответ 2

У нокаута есть следующая функция, которую я считаю именно тем, что вы ищете:

ko.isObservable(vm[key])

Ответ 3

Чтобы ответить на ответ RP Niemeyer, если вы просто хотите определить, что-то "подписывается" (что наиболее часто бывает). Тогда ko.isSubscribable также доступен.

Ответ 4

Я использую

ko.utils.unwrapObservable(vm.key)

Обновление. Начиная с версии 2.3.0 вместо ko.utils.unwrapObservable

был добавлен ko.unwrap