【问题标题】:"Dynamically bind" variable to another one“动态绑定”变量到另一个变量
【发布时间】:2017-10-12 07:20:23
【问题描述】:

我有这样的课程

class A {
    this.x
    this.y
}

class B {
    this.x = a.x
    this.y = a.y
}

我希望b.x 10 岁,而a.x = 10,当然,我可以做到

class B {
    set x ( xValue ) {
        a.x = xValue
    }
}

但这不适用于+=-= 或其他任何运算符

上下文
我有一个GameObject 类,并且在这个类中,有一个精灵类,我希望通过设置GameObject.xSprite.x = GameObject.x 来实现。我可以在渲染函数(func render () => Sprite.x = GameObject.x => render())中做到这一点,但这并不实用。

我想继续使用“JS 设计模式”,所以你们知道如何将b.x“绑定”到a.x(例如 C 中的指针)吗?

【问题讨论】:

  • @Carcigenicate 这个问题不是基于意见的。您质疑 为什么 做/不做这样的事情是它基于意见的原因,这从来不是原始问题的一部分。问题是,这可以做到吗?如果可以,怎么做?
  • @mhodges 最后的那一点似乎是在问应该首选哪个。我是在跑火车的时候读的,显然我误解了。
  • 对于OP的查询,你可以通过一个叫做prototypal inheritance的概念来实现一个“实时链接”,它是建立在JavaScript之上的。事实上,它是 JavaScript 优于经典 OOP 语言的一大优点。
  • 抱歉,由于歧义,我编辑了我的帖子

标签: javascript class methods


【解决方案1】:

您可以通过一个名为prototypal inheritance 的概念来实现“实时链接”,JavaScript 对象就是基于该概念构建的。事实上,它是 JavaScript 优于经典 OOP 语言的一大优点。

请记住,这种方法绑定了 B 函数对象本身的原型,而不是绑定到 B 的各个实例上。因此,B 的每个实例都有指向a 的实时链接。但是,这些可以在每个单独的实例上被覆盖,因为 JavaScript 在遍历原型链之前查找属性时将从调用对象开始。

function A () {
  this.x = 0;
  this.y = 0;
}

function B () {

}
var a = new A();
B.prototype = a;

var b = new B();

a.x += 5;
console.log(b.x);
a.x = 3;
console.log(b.x);

【讨论】:

  • 但是原型继承只适用于“纯函数”对吧?我不能在类中使用这个方法
  • @AlexandreDaubricourt JavaScript 中没有真正的类或经典继承——它总是回到幕后的原型链。 IMO,出于这个原因,我讨厌 class 关键字;在某些情况下,它是模棱两可且非常有限的。
  • 好吧,所以我想更好的方法是在需要 B.x 时“手动”将 B.x 绑定到 A.x (B.x = A.x)?
  • @AlexandreDaubricourt 是的,但除非A.x 是对象或数组,否则您不会获得引用/指针,而是会获得值的副本。
  • @mhodges 很高兴认识另一个发现 JS 类是一种黑暗模式的人。
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2018-06-12
  • 2021-03-21
  • 2014-06-11
相关资源
最近更新 更多