为什么ko.observableArray.length不返回底层数组的长度?

Jos*_* M. 4 javascript arrays knockout-2.0 knockout.js

使用Knockout时,使用a时observableArray,必须获取底层数组(myArray())才能读取长度.我不明白为什么myArray.length不返回底层数组的长度(而是返回0).这是一个错误还是我错过的原因?

JSFiddle: http ://jsfiddle.net/jsm11482/LJVWE/

JS /型号

var data = {
    name: ko.observable("Test"),
    items: ko.observableArray([
        { name: ko.observable("First Thing"), value: ko.observable(1) },
        { name: ko.observable("Second Thing"), value: ko.observable(2) },
        { name: ko.observable("Third Thing"), value: ko.observable(3) }
    ])
};

ko.applyBindings(data, document.getElementsByTagName("div")[0]);
Run Code Online (Sandbox Code Playgroud)

HTML

<div>
    <h1 data-bind="text: name"></h1>
    <ul data-bind="foreach: items">
        <li data-bind="text: value() + ': ' + name()"></li>
    </ul>

    <div>
        <strong>data.items.length == </strong>

        <!-- Expecting 3, get 0. -->
        <span data-bind="text: items.length"></span>
    </div>
    <div>
        <strong>data.items().length == </strong>

        <!-- Expecting 3, get 3. -->
        <span data-bind="text: items().length"></span>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

Jer*_*oen 5

这是因为plain itemsobservable实际上是一个Function,它有自己的length属性来指示预期的参数数量.

MDN的功能页面(属性部分):

length
指定函数预期的参数数.

作为使用KnockoutJS库的开发人员,我最初也希望 observableArray的长度是底层数组的长度,但我确实感谢KO库没有覆盖此Function属性,因为这可能会导致其他不需要的方面 -效果.