是否可以在__proto__函数中获取父对象的实例?

时间:2019-04-30 07:11:29

标签: javascript object

// 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})

显然这是行不通的,因为setGeo中的this指向func

2 个答案:

答案 0 :(得分:0)

您的问题可以简化为想要访问该函数的父对象的情况。

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();

答案 1 :(得分:0)

您必须将obj继承到parentObject中,而不是直接在obj中使用func。然后,您在proto上的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})