Можно ли получить доступ к свойствам JSON с относительным синтаксисом при использовании определенных функций JSON? - PullRequest
3 голосов
/ 06 мая 2010
// JavaScript JSON
var myCode = 
{
   message : "Hello World",

   helloWorld : function()
   {
     alert(this.message);
   }
};
myCode.helloWorld();

Приведенный выше код JavaScript выдаст предупреждение «undefined».

Чтобы заставить его работать по-настоящему, код должен выглядеть следующим образом ... (обратите внимание на буквальный путь к myCode.message)

// JavaScript JSON
var myCode = 
{
   message : "Hello World",

   helloWorld : function()
   {
     alert(myCode.message);
   }
};
myCode.helloWorld();

У меня вопрос ... если я объявляю функции с помощью json таким образом, есть ли какой-нибудь "относительный" способ получить доступ к myCode.message или это возможно сделать только с помощью буквального пути к пространству имен myCode.message?

Ответы [ 3 ]

6 голосов
/ 06 мая 2010

Ваш первый пример работает, значение this внутри функции helloWorld будет ссылаться на сам объект myCode, потому что вы вызвали его с помощью myCode.helloWorld();

Когда вы вызываете функцию, которая является членом объекта, этот объект будет установлен как this значение функции.

В этом случае myCode является базовым объектом из ссылки myCode.helloWorld.

Есть еще два случая, когда ключевое слово this неявно неявно , например, когда вы вызываете функцию, которая не связана как свойство какого-либо объекта, т. Е .:

myFunc();

Значение this внутри myFunc будет указывать на глобальный объект.

При использовании оператора new:

var obj = new MyFunc();

Значение this внутри MyFunc будет ссылаться на вновь созданный объект.

И вы можете установить this значение функции явно, используя call или apply:

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

Просто примечание, это не JSON , JSON - это просто формат обмена данными, его грамматика отличается от синтаксиса JavaScript Object Literal , например:

{ foo: "bar" }

Выше приведен допустимый литерал объекта JavaScript, но он не является допустимым JSON, JSON требует, чтобы идентификаторы свойств были заключены в кавычки, и он имеет ограниченный набор разрешенных типов данных, например, у вас не может быть функций как члены объекта JSON.

0 голосов
/ 06 мая 2010

CMS ударил ногтем по голове, если вы хотите больше информации, вы можете проверить http://www.scottlogic.co.uk/blog/chris/2010/05/what-is-this/

0 голосов
/ 06 мая 2010

номер

Прежде всего, это не JSON. То, что у вас есть, это просто объектный литерал. JSON - это формат данных, который не поддерживает функции.

Во-вторых, это понимание того, как эта привязка работает.

Если явно не связано с помощью call () или apply () или не используется внутри метода экземпляра объекта, this всегда ссылается на текущий window объект.

Поскольку вы определяете myCode как литерал объекта, регистр "экземпляр объекта" не применяется. Кроме того, вы не используете call() или apply(), поэтому они также не применяются. Таким образом, в коде вашего первого примера this равен window, поэтому вы получаете неопределенное значение (поскольку window.message не определено).

Вы уже знаете об этом - ваш второй фрагмент кода. Ваш другой выбор - на самом деле пойти дальше и использовать call() или apply().

var myCode = 
{
   message : "Hello World",

   helloWorld : function()
   {
     alert( this.message );
   }
};
myCode.helloWorld.call( myCode );

Таким образом, вы в основном говорите Javascript использовать myCode как this, и он будет работать как положено.

Другой вариант - сделать myCode инстанцируемым.

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

...