Как получить доступ к родительскому объекту из его функции? - PullRequest
0 голосов
/ 29 апреля 2018

Так что я пытаюсь сделать что-то хитрое, но не могу забыть.

У меня есть такой объект:

var dummyObject = {
    src: 'Source code',
    fileExt: 'ejs',
}

А потом другая функция создает копию этого объекта с функцией render(), поэтому по сути это будет:

{
    src: 'Source code',
    fileExt: 'ejs',
    render: function() {
        ...
    }
}

Допустим, я определил эту копию dummyObject как копию с именем copyObject. Есть ли способ вызвать copyObject.render() и получить доступ ко всем copyObject свойствам без передачи его в качестве аргумента?

Важно отметить, что я не буду определять функцию в объявлении объекта, а скорее определю, а затем назначу ее программно, что-то вроде:

var copyObject = _clone(dummyObject)
copyObject.render = function() {...}

Спасибо!

РЕДАКТИРОВАТЬ: На всякий случай мой вопрос неверно истолкован (я набрал его, когда было поздно, и я устал). В этом случае dummyObject следует игнорировать, поскольку copyObject является новой новой копией без каких-либо ссылок. Так что в основном я добавляю метод к copyObject, и мне нужен он для доступа к самому себе. Как это:

function selectProcessor (obj) {
    var newObj = _clone(newObj)
    newObj.render = function () {
        console.log(this.src) // It doesn't make sense accessing this from here
    }
    return newObj
}

// At some point I execute this function
var copyObject = selectProcessor(dummyObject)

// Now I call its render function, and the behavior I want is to log its src property
copyObject.render()

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Я не могу сказать, есть ли в вашем сообщении опечатка, но если нет, вот ваш ответ. Казалось, что вы хотели сказать «получить доступ ко всем исходным свойствам объекта», в этом случае нет, не в том случае, если они отсутствуют в прототипе, и вы не создали объект, используя Object.create(oldObj.prototype) и т. Д.

var obj = {
  a: true,
  b: 92
};

var changeIt = function ( o ) {
  return Object.assign({}, o, {
    render: function () {
      return this.b;
    }
  });
};

var newObj = changeIt(obj);

console.log(newObj.render()); // Prints 92 - value of obj.b and this.b
0 голосов
/ 29 апреля 2018

Вы можете использовать метод Object.create() для создания нового объекта, и этот новый объект может получить доступ к dummyObject по цепочке прототипов .

var copyObject = Object.create(dummyObject)
copyObject.render = function() {...}   // access render method of dummyObject

var dummyObject = {
  src: 'Source code',
  fileExt: 'ejs'
};

var copyObject = Object.create(dummyObject);

dummyObject.render = function() {
  console.log('render method of dummyObject');
}

copyObject.render();

См. MDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...