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

时间:2013-12-08 17:01:01

标签: javascript

任何任意对象是否有可能获得对访问者函数的引用,该函数与[]运算符完全相同?

如下所示?:

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

因此,如果我有一个对象 foo 而不是foo['bar']我可以调用foo.get('bar')

4 个答案:

答案 0 :(得分:4)

你可以写一个函数:

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") );

答案 1 :(得分:3)

是的,通过原型设计

var foo = {bar : 3};

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

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

FIDDLE

不知道你为什么需要它?

答案 2 :(得分:0)

你可以。

http://jsfiddle.net/sdaDK/

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

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

答案 3 :(得分:0)

如果您只需要一个对象的此功能,那么您可以

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原型中是扩展任何属性的方式。