簡體   English   中英

JavaScript:我可以使用方括號([])運算符作為函數嗎?

[英]JavaScript: Can I use square brackets ([]) operator as a function?

任何任意對象是否有可能獲得對訪問函數的引用,該函數與[]運算符完全相同?

像下面這樣的東西?:

function get(x) { return this[x] }

所以如果我有一個對象foo而不是做foo['bar']我可以調用foo.get('bar')

你可以寫一個函數:

function get( propertyName ) {
  return this[ propertyName ];
}

然后,您可以將該函數綁定到某個特定對象:

var myObject = { /* ... */ }; // that looks like a little face, kind-of
var getter = get.bind(myObject);

現在,為什么這很有趣? 我能想到的唯一原因是它為您提供了一個可以傳遞給其他代碼的對象(函數的綁定版本),允許該代碼獲取屬性值但不更新它們。 我想這很有用,雖然我不能說我發現自己想要它。

你可以在Object原型中添加一個“get”函數,但如果你這樣做,我會這樣做,以使它不可枚舉。 否則,你可能會在for ... in循環中出現奇怪的行為:

Object.defineProperty(Object.prototype, "get", {
  value: function( key ) { return this[key]; }
});

如果你正在進行函數式編程,另一個有趣的事情就是你的“get”函數的語義。 我上面做的示例使得除了作為任何屬性的getter之外,還可以創建一個函數來獲取對象的特定屬性:

var getSomeObjectName = get.bind( someObject, "name" );

現在函數“getSomeObjectName”將執行的操作是獲取“name”屬性值。

考慮高階函數也可能很有趣。 一個非常有用的概念是“pluck”函數,用於從對象中提取特定屬性。 它有點像“得到”,但我會用不同的方式寫出來:

function pluck(propertyName, object) {
  object = object || this;
  return object[propertyName];
}

現在我可以像以前一樣制作一個吸氣劑,幾乎是一樣的:

var getter = pluck.bind( someObject );

或者,我可以為特定屬性名稱創建一個“plucker”,它將從任何對象獲取該屬性:

var getName = pluck.bind(null, "name");

現在我可以致電:

getName( someOtherObject )

這實際上就像打電話一樣

pluck( "name", someOtherObject )

因為我在“getName”函數中“預加載”了第一個參數(“name”)。 這對於像.map()工具這樣的東西非常有用:

var myArray = [
  { name: "Thomas", type: "tank engine" }
, { name: "Flipper", type: "dolphin" }
, { name: "Rocinante", type: "horse" }
// ...
];

var allNames = myArray.map(pluck.bind(null, "name"));

你當然可以寫一個包裝器函數來隱藏對.bind有點丑陋的調用:

function plucker( name ) {
  return pluck.bind(null, name);
}

allNames = myArray.map( plucker("name") );

是的,通過原型設計

var foo = {bar : 3};

Object.prototype.getz = function(what) {
    return this[what];
}

var value = foo.getz('bar'); // outputs 3

小提琴

不知道你為什么需要它?

您可以。

http://jsfiddle.net/sdaDK/

var foo = {
    bar: 'foo2',
    get: function (a) { return this[a]; }
}

alert(foo.get('bar'));

如果您只需要一個對象的此功能,那么您可以這樣做

var myObject = {
    x: 'anything',
    get: function (x) { return this[x]; }
}
alert(myObject.get('x'));

或者,如果您需要為所有對象使用此對象,則需要擴展Object類的原型

var myObject = {
    x: 'anything'
}
Object.prototype.get = function(x) {
    return this[x];
}
var value = myObject.get('x');

在javascript原型中是擴展任何屬性的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM