首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(javascript)使用"call“调用es6 getter

(javascript)使用"call“调用es6 getter
EN

Stack Overflow用户
提问于 2020-04-13 19:33:32
回答 1查看 518关注 0票数 2

我正在尝试创建一个(类)实例,它复制另一个类的行为,但使用它自己作为状态上下文(this)。普通函数可以正常工作(就像下面示例中的setValue函数),但getter不能工作。下面是一个简单的例子:

代码语言:javascript
复制
const should = require('chai').should();

class One {
    setValue(val) {
        this._val = val;
    }

    get val() {
        return this._val;
    }
}

class Two {
    constructor(one) {
        this.one = one;
    }

    setValue(val) {
        this.one.setValue.call(this, val);
    }

    get val() {
        this.one.val.call(this);
    }
}

let one = new One();
let two = new Two(one);
one.setValue(1);
two.setValue(2);
one.val.should.equal(1);
two.val.should.equal(2);

上面的代码在最后一行分解,错误如下:

代码语言:javascript
复制
TypeError: this.one.val.call is not a function
    at Two.get val [as val] (C:\all\code\node-tests\invoke_getter.js:23:22)
    at Object.<anonymous> (C:\all\code\node-tests\invoke_getter.js:32:5)

我怎么才能让这样的东西工作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-13 20:05:10

回想一下,类的属性getter在其prototype中结束

因此,要访问该方法,您可能需要从其原型中获取它:

代码语言:javascript
复制
const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this.one), 'val')

然后,您可以在two实例上调用getter:

代码语言:javascript
复制
class One {
  setValue(val) {
    this._val = val
  }

  get val() {
    return this._val
  }
}

class Two {
  constructor(one) {
    this.one = one
  }

  setValue(val) {
    this.one.setValue.call(this, val)
  }

  get val () {
    const desc = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(this.one), 'val')
    return desc.get.call(this)
  }
}

const one = new One()
const two = new Two(one)
one.setValue(1)
console.log(two.val) // undefined (since _val does not exist on two yet)
two.setValue(2)
console.log(two.val) // 2
two._val = 3
console.log(two.val) // 3

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61186982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档