Javascript:通过在数组上循环来创建对象方法/属性
Javascript: Create object methods/properties by looping over an array
我真正想要的是如下代码:
var painter = {}; // An object to hold methods
var colors = ['blue', 'red', 'green', 'yellow']; // The names of methods to be defined
colors.forEach( function(color) {
painter.defineMethod(color, function(){ console.log(color); });
});
painter.blue() // writes blue
painter.red() // writes red
etc.
画家.defineMethod()是关键。
我必须为一个对象定义几个(超过40个)方法,它们基本上都是相同的,只是有一些微小但可预测的更改,这些更改实际上都调用了另一个方法。例如:
painter.blue = function(tool) {
painter.draw('blue', tool); // Would paint blue with a brush or pencil or whatever.
}
这样的事情可能吗,还是我一直在明确地定义所有这些属性?以这样或那样的方式有任何性能优势吗?
在一种拥有可变变量或神奇方法的语言中,简单的事情在Javascript中被证明是困难的(或不可能的)。尽管我承认javascript不是我的专长。
谢谢!
你的直觉是正确的,你确实可以自动化:
colors.forEach( function(color) {
painter[color] = function(tool) {
painter.draw(color, tool);
};
});
这里有两件事在起作用:
在JavaScript中,您可以使用句点表示法和属性名称literal(
obj.foo
),或者使用括号表示法和特性名称字符串来访问(获取或设置)属性(obj["foo"]
)。在后一种情况下,字符串可以是任何表达式的结果,包括变量查找。因此,painter[color] = ...
为名称来自color
参数的属性赋值。然后我们使用这样一个事实,即我们正在创建的函数是对我们给
forEach
的迭代函数的调用的闭包,因此我们可以在该函数中使用color
参数。即使对迭代函数的调用返回,因为我们在调用中创建了一个函数并保留了对它的引用,该函数也保留了对上下文的引用(它是上下文上的闭包),因此我们可以依赖于color
参数。更多关于闭包的信息(在我的博客上):闭包并不复杂
但是,由于painter.draw
将颜色作为第一个参数,将工具作为第二个参数,如果你愿意,还有第二种方法可以做到:你可以在painter.draw
:上使用Function#bind
(一种ES5功能,可以在越来越少的没有它的旧引擎上填充)将颜色参数"咖喱"到方法中
colors.forEach( function(color) {
painter[color] = painter.draw.bind(painter, color);
});
Function#bind
返回一个函数,当调用该函数时,该函数调用具有给定this
值(上例中为painter
)的原始函数,以及提供给bind
的任何其他参数,然后是提供给原始函数的任何参数。一个简单的例子可能会让这一点变得更清楚:
function func(a, b) {
snippet.log("this.name = " + this.name);
snippet.log("a = " + a);
snippet.log("b = " + b);
}
var o1 = {
name: "o1"
};
var o2 = {
name: "o2"
};
var o1boundfoo = func.bind(o1, "foo");
var o2boundbar = func.bind(o2, "bar");
o1boundfoo("nifty"); // Shows:
// this.name = o1
// a = foo
// b = nifty
o2boundbar("nifty"); // Shows:
// this.name = o2
// a = bar
// b = nifty
<!-- Temporary snippet object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
- 这两种不同的创建对象文字的方法有什么区别
- Javascript,用vars创建对象的最佳方法
- 为什么用构造函数创建对象会执行对象's方法
- RequireJS创建对象副本的方法
- Javascript-推荐的创建对象的方法
- 在默认情况下将可枚举设置为 false 的 JS 中创建对象属性的其他方法是什么
- 流星动态创建对象并引用它们?有没有一种简单的方法可以做到这一点
- Javascript:通过在数组上循环来创建对象方法/属性
- 如何从原型方法创建对象的实例
- 什么's在对象内部创建原型方法的缺点
- Javascript”;Privileged”;未按对象重新创建的方法
- 从javascript对象方法中的变量创建新对象
- 在 JavaScript 中创建对象的更好方法是什么?
- 这种创建对象的方法是否只适用于单例对象?
- 是否有一种方法可以使用变量创建对象并忽略未定义的变量
- 如何从两个不同的fs方法创建对象
- 创建对象后设置原型属性的可移植方法是什么?
- 在javascript中创建对象的两种方法
- 如何使用构造函数创建对象并使用Invoked方法返回随机结果
- 从HTML创建对象和调用JavaScript方法