Possible Duplicate:
Self-references in object literal declarations
I have an object literal which is used as a configuration element and is looked up for keys.
customRendering:{
key1: func(){....},
key2: func(){....}
}
I have a situation where key2
and key3
can use the same function. Is there a way to assign the same function to both key2
and key3
without having to declare the function outside the object literal and without having to declare an extra key?
I was hoping I could do something like:
key2: key3: func(){....}
No, JavaScript objects cannot have duplicate keys. The keys must all be unique.
The object key (or key name) uniquely identifies the object in an Amazon S3 bucket.
The lesson has conveyed that keys can have multiple values. If the exercise text suggests that anywhere, it's certainly incorrect. Each key can only have one value. But the same value can occur more than once inside a Hash, while each key can occur only once.
I don't know what I was thinking earlier. If you're fine with using a more verbose "literal" you can instantiate a custom function:
o = new function () {
this.foo = function () { console.log('works'); };
this.bar = this.foo;
};
you could use a temporary variable to store the reference to the function while setting the object. Be careful to use a closure and to call var
before using it so that you don't pollute the global namespace:
(function () {
var o, baz;
o = {
foo: baz = function () {console.log('works')},
bar: baz
}
//more code
}());
The reason I'm calling this a dirty nasty hack is that it makes the code less readable, it's harder to tell examining this code (especially if the object literal declaration was longer) where baz
was set.
Better to just write the alias outside the object literal so that it's explicitly visible that it is an alias.
Note: the named function format doesn't work:
o = { //THIS WON'T WORK
foo: function baz() {/* code */},
bar: baz
}
There's no way within an object literal to define an alias using a shared reference.
You can use an aliasing function, but it wont be an identical reference:
o = {
foo: function...
bar: function () { return this.foo() } //even better if you use `apply` or `call`
}
The typical way to share a reference is after the object literal, which sounds like what you wanted to avoid:
o = {
foo: function...
}
o.bar = o.foo;
Alternatively as you pointed out in your question (and for completeness) you could define the function outside of the object literal:
func = function () {/* code */};
o = {
foo: func,
bar: func
}
In response to @Peter about returning an object from a function
Using a self-executing anonymous function is another way of instantiating an object inline, and would make this entire question moot:
o = (function () {
var o = {
foo: function () {/*code*/}
}
o.bar = o.foo;
return o;
}());
Or like this:
var o = (function () {
var shared = function() { console.log("shared") };
return {
foo: shared,
bar: shared
}
}());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With