0

Why calling Person in window scope is returning "[Object Object]" while call that in object scope is returning Object.

enter image description here

enter image description here

Suresh kumar
  • 475
  • 1
  • 4
  • 10
  • Well, just don't do `Person.call(window, …)`. That'll attempt to set `window.name`. And no, this has nothing to do with scopes - if you refer to the `this` keyword, that's the *context* or *receiver* of the call. – Bergi Jun 02 '17 at 04:16

2 Answers2

1

global window object already have a property of name, and it's inside the scope of native code.

https://www.w3schools.com/jsref/prop_win_name.asp

Val
  • 21,938
  • 10
  • 68
  • 86
0

window.name is a getter/setter to set the name of the window. As such, it has to be of type string.

Try this:

window.name = ["something", "else"];

You will see that now window.name is set to "something,else"; which is the result of Array.toString().

This is exactly what is happening here. When you call an object's toString, you get [object Object].

Your program works fine if you do not use the predefined window.name getter/setter.

function Person(first, last) {
    this.something = {
        first,
        last
    };
}

f = {};

Person.call(f, "fsd", "fsd");
console.log(f.something);

g = window;
Person.call(g, "fsd", "fsd");
console.log(g.something);

More on getter/setters in javascript:

Setters: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/set

Getters: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/get

squgeim
  • 2,321
  • 1
  • 14
  • 21