36 ms·
> `bar` DOES equal 5 No, it doesn't. Javascript is a bit weird when it comes to return statements inside constructors. `bar` will be equal to `type` only if `(
by lhorie 14y ago
> `bar` DOES equal 5
No, it doesn't. Javascript is a bit weird when it comes to return statements inside constructors. `bar` will be equal to `type` only if `(type instanceof Object) == true`. Otherwise, it will be a new object.
function Foo(type) { this.type = type; return type; }
console.log(new Foo(/a/)); // Regexp /a/
console.log(new Foo("a")); // {type: "a"}
console.log(new Foo(5)); // {type: 5}
console.log(new Foo([1,2])); // [1,2]
console.log(new Foo({a:1})); // {a: 1}
- jlongster 14y agoHuh, you're right. I thought I typed that at the REPL and it gave back 5, but obviously I typed the wrong thing. Almost all cases that I've used this functionality have been to return a different object. I suppose when you say "new" you're supposed to expect an object, which is why it works that way.
- ynniv 14y agoa good time to point out that calling Object() without "new" returns a new object. This is often unexpected when creating inheritance schemes that chain the parent constructor. https://github.com/documentcloud/backbone/pull/1269 https://github.com/documentcloud/backbone/pull/1269
- lhorie 14y agoNot sure I understand your comment, given the link you gave. IMHO the return value of calling `Object()` without parameters is exactly what one would expect. Calling it w/ parameters is what I think causes surprising behavior var x = {a: 2} console.log(x === x) // true console.log(Object(x) === x) // true console.log(new Object(x) === x) // true For the `Object.call(x)` case, I'd expect it to return a new object (and not x), for the same reason I'd expect [].slice.call(arguments) to return a new array (and not arguments).
- ynniv 14y ago[].slice.call(arguments) returning a new argument is fundamentally different because you would not want x.slice(1,2) to modify x in order to produce an appropriate sublist to return. Perhaps it's just me, but I expect a constructor to initialize "this" (optionally returning "this"), but not returning {};
- lhorie 14y agoDisagree. To illustrate: window.test = 2 var b = Object.call(window) //this is the same as `var b = window.Object()` and therefore the same as `var b = Object()` assert(b.test == 2) //why should this be true?