在 Javascript 中编入​​索引 getter

Indexed getter in Javascript

我正在使用直接 Javascript(请不要使用 JQuery 或类似的东西)。我实现了一个包装数组的 class,因此:

class Ctrls
{
    _items = new Array();
        
    constructor()
    {
        this._items = new Array();
    }   
    
    Add(oCtrl)
    {
        this._items.push( { key:oCtrl.Name, value:oCtrl } );
    }   
    
    Clear()
    {
        this._items = new Array();
    }   
    
    get Count()
    {
        return this._items.length;
    }   
    
    get Item(index)
    {
        // get the index'th item. 
        // If item is numeric, this is an index.
        // If item is a string, this is a control name
        if (Number.isInteger(index))
        {
            return this._items(index).value;
        }
        else
        {
            item = this._items.find(element => (element.value.Name == index));
            return item;
        }
    }   
    
    get Items()
    {
        return this._items; // in case we desperately need to
    }
}

我在 get Item(index)(即 Uncaught SyntaxError: Getter must not have any formal parameters)页面加载时遇到错误。我来自 C# 世界,正在寻找等效于:

public Ctrl Item(iIndex)
{
    get
    {
        return _items[iIndex];
    }
}

如何在 Javascript 中索引 getter?


Edit(1):我曾建议将 get Item 变成一个函数,但如果我将定义更改为:

    function GetItem(index) // returns Ctrl
    {
        // get the index'th item. 
        // If item is numeric, this is an index.
        // If item is a string, this is a control name
        if (Number.isInteger(index))
        {
            return this._items(index).value;
        }
        else
        {
            item = this._items.find(element => (element.value.Name == index));
            return item;
        }
    }   

我在页面加载时收到此错误:Uncaught SyntaxError: Unexpected identifier 在行 function GetItem...


Edit(2): 将上面修改为:

    GetItem(index) // returns Ctrl
    {
        // get the index'th item. 
        // If item is numeric, this is an index.
        // If item is a string, this is a control name
        if (Number.isInteger(index))
        {
            return this._items(index).value;
        }
        else
        {
            item = this._items.find(element => (element.value.Name == index));
            return item;
        }
    }   

as classes 中的函数不使用 function 关键字,这很奇怪。这现在有效。谢谢大家

“你不能在 JS 中将参数传递给 getter”。理论上:是的,你不能那样做。但实际上:函数是 JS 中的 first-class 公民,因此它们可以是函数的参数或 return 值。你可以这样做:

class GetterWithParameter {
  constructor() {
    this.array = ["index 0", "index 1", "index 2"]
  }
  get itemAtIndex() {
    return (idx) => this.array[idx]
  }
}

const getterWithParameter = new GetterWithParameter()

const idx0 = getterWithParameter.itemAtIndex(0)
const idx1 = getterWithParameter.itemAtIndex(1)
const idx2 = getterWithParameter.itemAtIndex(2)

console.log("item at index 0:", idx0)
console.log("item at index 1:", idx1)
console.log("item at index 2:", idx2)

因此,虽然 getter 不能有参数,但您可以 return 一个可以接收参数的函数 - 并使用它。

当然,用法似乎与在 class 上定义需要相同参数的函数相同 - 但您仍然使用 getter.