Можно ли получить экземпляр родительского объекта внутри функции __proto__? - PullRequest
0 голосов
/ 30 апреля 2019
// module

const obj = {
  geo: {}
}

const func = function(){}

func.__proto__.setGeo = function({lon, lat} = {}){
  return this.obj.geo = {lon, lat};
}

const parentObject = {
  func,
  obj
}

module.exports = parentObject

// controller

const parentObject = require('./module')

parentObject.func.setGeo({lon: 1, lat: 2})

Очевидно, это не работает, потому что this внутри setGeo указывает на func.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Вместо использования obj непосредственно в parentObject Вы должны наследовать obj в func.Тогда ваш setGeo на прото получит доступ к obj, используя этот экземпляр.Проверьте изменения ниже.

// module

const obj = {
  geo: {}
}

const func = function(){}

func.__proto__.obj = obj; // Inheriting parent

func.__proto__.setGeo = function({lon, lat} = {}){
  return this.obj.geo = {lon, lat};
}

const parentObject = {
  func
}

module.exports = parentObject

// controller

const parentObject = require('./module')

parentObject.func.setGeo({lon: 1, lat: 2})
0 голосов
/ 30 апреля 2019

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

o = {
    f: function() {console.log(this)},
    g: 1
}

Теперь ключевое слово this всегда будет указывать на вызывающий контекст. Однако контекст вызова может различаться в разных сценариях.

  1. Простой вызов функции.

    o.f();  
    

    В этом случае вызывающим контекстом является объект o, к которому вы пытаетесь получить доступ.

  2. Вызов функции в определенном контексте

            o.f.call({name: 'new context'})
    

    В этом случае контекст вызова - {name: 'new context'}

  3. Использование функции в качестве конструктора

            obj = new o.f()
    

    В этом случае контекст вызова - это новый объект, который вы создаете

Теперь, , что наиболее важно , если объект o является прототипом другого объекта o1, вызов вышеупомянутых методов через o1 дает те же результаты.

Вот три случая. Обратите внимание на консоль.

o = {
    f: function() {console.log(this)},
    g: 1
}

o.f();  

o.f.call({name: 'new context'})

obj = new o.f()


o1 = Object.create(o);
o1.f();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...