Is it possible to access JSON properties with relative syntax when using JSON defined functions? Is it possible to access JSON properties with relative syntax when using JSON defined functions? json json

Is it possible to access JSON properties with relative syntax when using JSON defined functions?


Your first example works, the this value inside the helloWorld function will refer to the myCode object itself, because you invoked it by myCode.helloWorld();

When you invoke a function that is member of an object, this object will be set as the this value of the function.

In this case myCode is the base object of the myCode.helloWorld reference.

There are two more cases about how the this keyword is implicitly, for example, when you call a function that is not bound as property of any object, i.e.:

myFunc();

The this value inside myFunc will point to the global object.

When you use the new operator:

var obj = new MyFunc();

The this value inside MyFunc will refer to a newly created object.

And you can set the this value of a function explicitly, using call or apply:

function test () {  return this + " World";}test.call("Hello"); // "Hello World"

Just a note, that's not JSON, JSON is simply a data interchange format, its grammar differs with the JavaScript Object Literal syntax, for example:

{ foo: "bar" }

The above is a valid JavaScript object literal, but is not valid JSON, JSON requires the property identifiers to be wrapped between quotes, and it has a limited set of data types allowed, for example, you cannot have functions as members of a JSON object.


No.

First of all, this is not JSON. What you have here is just an object literal. JSON is a data format, and doesn't support functions.

Second, is an understanding of how this binding works.

Unless explicitly bound via call() or apply() or used inside the method of an instantiated object, this always refers to the current window object.

Since you define myCode as an object literal, the "instantiated object" case doesn't apply. Also, you aren't using call() or apply() so those don't apply either. So in the code of your first example, this is equal to window which is why you get undefined (since window.message is undefined).

You already know one way around this - your 2nd code snippet. Your other choice is to actually go ahead and use call() or apply().

var myCode = {   message : "Hello World",   helloWorld : function()   {     alert( this.message );   }};myCode.helloWorld.call( myCode );

This way, you are basically telling Javascript to use myCode as this and it will work as expected.

Another option is to make myCode instantiable.

var myCode = function(){  this.message = 'Hello World';  this.helloWorld = function()  {    alert( this.message );  }}var mc = new myCode();mc.helloWorld();