【问题标题】:Referencing Object Properties in Javascript在 Javascript 中引用对象属性
【发布时间】:2011-11-06 07:07:04
【问题描述】:

如果我有代码:

function RandomObjectThatIsntNamedObjectWhichIOriginallyNamedObjectOnAccident() {
    this.foo = 0;
    this.bar = function () {
        this.naba = function () {
            //How do I reference foo here?
        }
    }
}

【问题讨论】:

  • 附带说明,Object 是一个糟糕的函数名。您可以覆盖 javascript 的对象
  • 这取决于您要如何处理naba。你怎么称呼它?你在用Object 做什么? this 所指的最终取决于您调用函数的方式。只要我们不知道这一点,我们就只能猜测什么是最好的解决方案。

标签: javascript oop object


【解决方案1】:

您需要self 参考:

function RandomObjectThatIsntNamedObjectWhichIOriginallyNamedObjectOnAccident() {
    var self = this;
    this.foo = 0;
    this.bar = function () {
        this.naba = function () {
            self.foo; //foo!
        }
    }
}

【讨论】:

  • 我考虑过使用它,但担心它实际上可能会创建对象的副本,而不仅仅是创建引用。非常感谢大家!
  • 当然,你永远不能创建一个“对象”,因为它会覆盖Object
  • @ConnerRuhl -- 没问题 ^_^
  • @IAbstractDownvoteFactory -- 我知道,我刚刚离开了 OP 的帖子。并没有真正想到对象的名称。
【解决方案2】:
function SomeObject() {
    var self = this;
    this.foo = 0;
    this.bar = function () {
        this.naba = function () {
            self.foo;
        }
    }
}

【讨论】:

  • +1 在我之后 2 秒进入 ^_^
  • 我责怪验证码,我会早 20 秒 ;)
【解决方案3】:

试试下面的

function SomeObject() {
    var self = this;
    this.foo = 0;
    this.bar = function () {
        this.naba = function () {
            //How do I reference foo here?
            self.foo
        }
    }
}

【讨论】:

  • 你真的应该使用var self,因为this.self 将使self 可以公开访问。
  • @Rocket,好吧,不,它只会有和以前一样的问题......你无法访问它,我看不出它是如何工作的。
  • @JaredPar -- 很好的解决方法,它让我内心感到温暖和模糊,拥有 >150K 代表的用户仍然会犯错误:-P
  • @Neal 我犯了很多错误,尤其是如果我在早上喝完咖啡之前发帖:)
【解决方案4】:

首先:不要将函数命名为 Object,它会影响全局 Object 构造函数。

我看不出为什么必须在 bar 内将 naba 分配给实例。你为什么做这个?您可以将barnaba 都分配给函数原型:

function MyConstructor() {
    this.foo = 0;
}

MyConstructor.prototype.bar = function () {

};

MyConstructor.prototype.naba = function () {
    // this.foo
};

最终这取决于如何您调用naba 函数。您将其分配给 this 的事实表明您想使用它来调用它

var obj = new MyConstructor();
obj.naba();

如果您只想在调用bar 之后添加naba,您仍然可以通过this.foo 访问foo

MyConstructor.prototype.bar = function () {
    if(!this.naba) {
        this.naba = function() {
            // this.foo
        };
    }
};

var obj = new MyConstructor();
obj.bar();
obj.naba();

如果你想要一个正确/更好的答案,你必须展示你将如何使用naba

【讨论】:

  • 您的建议并不等同。 naba 被分配给 bar,而不是对象。我一般建议你不要使用thisprototype,因为它很容易出错。大多数人似乎完全误解了 JavaScript 的工作原理(以及它在没有原型的情况下也能工作)。如果您愿意,我可以发布不使用 thisprototype 的等效解决方案。
  • @Frits:我想我明白它是如何工作的。 naba 永远不会分配给bar,它会分配给this 所指的任何内容。它很可能是构造函数的一个实例,但也可能是window。但是this从不bar。如果你有一个构造函数,那么使用原型是附加实例方法的首选方式(节省内存)。而且我看不出this 或原型容易出错的地方。一开始可能很难理解,但总体上并没有什么神秘之处。
  • 看来你是对的,这正是我的意思,this 令人困惑。这是一个示例:jsfiddle.net/JZ7c2
  • @Fritz:this 所指的内容取决于如何调用该函数。有四种不同的方式,see my answer here。这意味着为了给出正确的答案,我们必须知道 OP 是如何调用所有这些函数的。
【解决方案5】:

有趣的是,你不需要做任何特别的事情。

this 参考作品:

function SomeObject() {
  this.foo = 0;
  this.bar = function () {
    this.naba = function () {
      alert(this.foo); // this works!
    }
  }
}

由于您始终将“方法”分配给同一个引用,this 仍将在 bar 中指向它,然后在 naba 中指向它。

【讨论】:

  • 当你 Object 是一个函数而 NOT 一个对象时。试试new。那么它就不起作用了。
  • 我认为这就是您要展示的内容:jsfiddle.net/t2Qha/1(令人惊讶地有效)
  • @Neal:当你调用var obj = new Object(); obj.bar(); obj.naba(); 时它会起作用,因为this 总是引用obj
  • @Neal:来吧,我们的cmets之间已经有25秒了。你检查我是否每 10 秒刷新一次页面? ;)
  • @Neal:是的,您的示例更好,但答案中的代码仍然相同...谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 2020-10-12
  • 1970-01-01
  • 2012-03-13
  • 2016-10-09
相关资源
最近更新 更多