JavaScript:我可以使用方括号([])操作符作为函数吗?

JavaScript:我可以使用方括号([])操作符作为函数吗?,javascript,Javascript,任何任意对象都有可能获得对访问器函数的引用,该函数将完全充当[]运算符吗 像下面这样的事情 function get(x) { return this[x] } 因此,如果我有一个对象foo而不是执行foo['bar'],我可以调用foo.get('bar'),您可以 是的,通过原型设计 var foo = {bar : 3}; Object.prototype.getz = function(what) { return this[what]; } var value = fo

任何任意对象都有可能获得对访问器函数的引用,该函数将完全充当
[]
运算符吗

像下面这样的事情

function get(x) { return this[x] }
因此,如果我有一个对象foo而不是执行
foo['bar']
,我可以调用
foo.get('bar')
,您可以

是的,通过原型设计

var foo = {bar : 3};

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

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


不知道为什么需要它?

您可以编写一个函数:

function get( propertyName ) {
  return this[ propertyName ];
}
然后可以将该函数绑定到某个特定对象:

var myObject = { /* ... */ }; // that looks like a little face, kind-of
var getter = get.bind(myObject);
现在,为什么这很有趣?我能想到的唯一原因是它给了您一个对象(函数的绑定版本),您可以将其传递给其他代码,允许该代码获取属性值,但不更新它们。我想这是有用的,尽管我不能说我发现自己想要它

您可以向对象原型添加一个“get”函数,但如果这样做,我会以使其不可枚举的方式进行。否则,您可能会有以下奇怪行为:
。。。在
循环中:

Object.defineProperty(Object.prototype, "get", {
  value: function( key ) { return this[key]; }
});
如果您正在进行函数式编程,另一件有趣的事情是“get”函数的语义。我在上面所做的示例使创建一个函数来获取对象的特定属性成为可能,此外还可以作为任何属性的getter:

var getSomeObjectName = get.bind( someObject, "name" );
现在,函数“getSomeObjectName”所要做的就是获取“name”属性值

P>>考虑高阶函数也可能是有趣的。一个真正有用的概念是“pull”函数,从对象中提取特定属性。这有点像“得到”,但我会用不同的方式来写:

function pluck(propertyName, object) {
  object = object || this;
  return object[propertyName];
}
现在我可以像以前一样做一个getter,方法基本相同:

var getter = pluck.bind( someObject );
或者,我可以为特定属性名创建一个“Pucker”,该属性名将从任何对象获取该属性:

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 myObject = {
    x: 'anything',
    get: function (x) { return this[x]; }
}
alert(myObject.get('x'));
或者,如果您对所有对象都需要它,那么您需要扩展对象类的原型

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

在javascript中,原型是扩展任何属性的方法

你想解决什么问题?这个问题本身,正如被问到的,似乎很奇怪。
[]
有什么问题吗?是的,如果写得正确,这是可能的。下面是一个工作示例:如果您有一个对象的引用,并且您有一个属性名,那么
[]
操作符已经允许您访问属性值。是的,你可以编写一个函数来使用运算符,但这如何使事情变得不那么复杂?@Pointy,将[]作为函数将有助于在函数范式中编写程序(将其作为高阶函数来编写其他函数,执行部分函数应用程序等等)。我知道如何通过原型来完成。我想知道是否已经有这样的功能,所以我不需要修改对象原型。这种方法最大的问题是可能会干扰其他库,因为对象原型中的更改随处可见。多么奇怪的评论啊,如果你知道怎么做,为什么要问,还有其他库使用Object.getz的可能性有多大,或者它会成为一个问题,我会说接近nill。不,本机没有这样的函数,这就是点括号符号的作用。@adeneo我不认为这是一个奇怪的注释。修改Object.prototype被广泛认为是不好的做法。我不知道绑定
bind
。它是ECMA5标准吗?虽然这个解决方案并不完全是我想要的,但由于没有这样的本机函数,这个解决方案似乎是最好的。与更改对象原型相比,我更喜欢它,因为它不会污染全局名称空间,而且我可以控制访问器函数的可见性。@wajda是的,
.bind()
是函数原型上一个相当新的标准方法。它在所有新浏览器中都可用,并且有针对旧浏览器的版本可用。改变内置对象原型本身就是一种有争议的做法。如果这样做,则应确保添加的函数不可枚举。(我会更新我的答案。)原因是,是的,我需要将[]-ish函数传递给另一个函数,以便以统一的方式读取我的对象属性。太棒了!谢谢:)
var myObject = {
    x: 'anything'
}
Object.prototype.get = function(x) {
    return this[x];
}
var value = myObject.get('x');