Javascript 确定对象属性是否可观察

Javascript 确定对象属性是否可观察,javascript,knockout.js,Javascript,Knockout.js,我使用的是2.0.0版 如果我循环遍历一个对象的所有属性,我如何测试每个属性是否是一个可观察的ko.observable?以下是我迄今为止所尝试的: var vm = { prop: ko.observable(''), arr: ko.observableArray([]), func: ko.computed(function(){ return this.prop + " computed";

我使用的是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);
    }

但到目前为止,一切都是假的。

Knockout包含一个名为
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
};

更新:如果您使用的是KO 2.1+,那么您可以使用
KO。isComputed

Knockout具有以下功能,我认为这正是您需要的功能:

ko.isObservable(vm[key])
我正在使用

ko.utils.unwrapObservable(vm.key)

更新:从2.3.0版开始,添加了
ko.unwrap
,作为
ko.utils.unwrapObservable
的替代品,以补充RP Niemeyer的答案,如果您只是想确定某个内容是否“可订阅”(这是最常见的情况)。然后也可以使用。

谢谢。您是否碰巧知道如何判断是否计算了可观测值?我可以通过
$.isArray(vm[key]())
确定一个可观察数组是否是一个可观察数组,但是你知道如何区分可观察数组和
ko。计算的
?应该在未来几周推出的ko 2.1将包括
ko.isComputed
函数。代码将与我在上面的答案中添加的代码相同。这将打开一个可观察的。它不会测试一个属性是否是可观察的。你是对的。但通常情况下,如果您需要了解以获得实际的可观察值;)它提供了一种有效的方法来访问可能可见或不可见的属性,但它本身并没有回答这个问题。