任何任意对象是否有可能获得对访问者函数的引用,该函数与[]
运算符完全相同?
如下所示?:
function get(x) { return this[x] }
因此,如果我有一个对象 foo 而不是foo['bar']
我可以调用foo.get('bar')
答案 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
不知道你为什么需要它?
答案 2 :(得分:0)
你可以。
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原型中是扩展任何属性的方式。