gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:53:03 25 4
gpt4 key购买 nike

是否有可能让任意对象获得对完全充当 [] 运算符的访问器函数的引用?

类似下面的内容?

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

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

最佳答案

你可以写一个函数:

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

然后您可以将该函数绑定(bind)到某个特定对象:

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

现在,为什么这很有趣?我能想到的唯一原因是它为您提供了一个对象(函数的绑定(bind)版本),您可以将其传递给其他代码,从而允许该代码获取属性值但不能更新 他们。我想这有点用处,但我不能说我发现自己想要它。

您可以向 Object 原型(prototype)添加一个“get”函数,但如果您这样做,我会以使其不可枚举的方式进行。否则,您可能会有 for ... in 循环的奇怪行为:

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

如果您正在进行函数式编程,需要考虑的另一件有趣的事情是“get”函数的语义。我在上面做的示例除了作为任何属性的 getter 之外,还可以创建一个函数来获取对象的特定属性:

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

现在“getSomeObjectName”函数要做的就是获取“name”属性值。

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

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

现在我可以像以前一样制作一个 getter,方法几乎相同:

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

关于JavaScript:我可以将方括号 ([]) 运算符用作函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20456146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com