Есть ли способ проверить родительский / вызывающий объект в JavaScript? - PullRequest
1 голос
/ 24 февраля 2012

При такой настройке:

var ObjectNamespace   = {}
var FunctionNamespace = function FunctionNamespace() {}

ObjectNamespace.User = function() {}
FunctionNamespace.User = function User() {}

Есть ли способ написать namespace метод для выполнения чего-то подобного:

ObjectNamespace.User.namespace() //=> "ObjectNamespace.User"
FunctionNamespace.User.namespace() //=> "FunctionNamespace.User"

Вы можете получить первый узел, выполнив что-тонапример:

ObjectNamespace.User.namespace = function() {
  return this.toString().match(/function *(\w+)/)[1]
}

ObjectNamespace.User.namespace() //=> "User"

Но у меня вопрос, есть ли способ ссылки на «родительский» объект, т.е. на объект, для которого определена функция User (ObjectNamespace)?Что-то мета по линии arguments.caller.callee.Таким образом, вы получите это:

ObjectNamespace.User.namespace() //=> "ObjectNamespace.User"

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Абсолютно нет.Давайте предположим, что это было, и мы называем это *.parent.Что будет делать следующий код:

var apple = {}, banana = {}, lemon = {};
banana.friend = apple.friend = lemon;

lemon.parent.otherThing = 6;

console.log(apple.otherThing, banana.otherThing);

// 6, undefined?
// undefined, 6?
// 6, 6?

Кто является родителем lemonapple, и banana есть, но это не имеет смысла ...

Кроме того, ваша идея, хотя и хороша, не будет работать, если вы вызовете функцию пространства имен вне контекста.

0 голосов
/ 24 февраля 2012

Когда-то было __parent__, но оно было удалено.Я не уверен, как это работает, смотрите ответ Дэвина.

Вы также можете взглянуть на Доступ к родителю родителя из объекта javascript .

...