在Javascript中引用对象属性

在Javascript中引用对象属性,javascript,oop,object,Javascript,Oop,Object,如果我有密码: function RandomObjectThatIsntNamedObjectWhichIOriginallyNamedObjectOnAccident() { this.foo = 0; this.bar = function () { this.naba = function () { //How do I reference foo here? } } } 您需要一个self参考: func

如果我有密码:

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

您需要一个
self
参考:

function RandomObjectThatIsntNamedObjectWhichIOriginallyNamedObjectOnAccident() {
    var self = this;
    this.foo = 0;
    this.bar = function () {
        this.naba = function () {
            self.foo; //foo!
        }
    }
}
试试下面的方法

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

第一:不要命名你的函数
对象
,它会影响全局
对象
构造函数

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

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。有趣的是,你不需要做任何特别的事情

参考工作:

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


由于您总是将“方法”分配给同一个引用,
仍将在
栏中指向它,然后在
naba中指向它
+1
,因为它在我之后2秒内到达^ ^我责备CAPTCHA,我会早20秒;)您应该真正使用
var self
,因为
this.self
将使
self
可公开访问。@Rocket,不,它将与以前有相同的问题。。。在您无法访问它的地方,我看不出它是如何工作的。@JaredPar--很好的解决方案,它让我感到非常温暖和模糊,具有>150K rep的用户仍然可以犯错误:-P@Neal我会犯很多错误,尤其是在我喝完早上的咖啡之前发布:)在旁注上,Object是一个糟糕的函数名。您可以覆盖javascript的ObjectIt,这取决于您将如何使用
naba
。你怎么称呼它?你在用
对象
做什么?此
所指的内容最终取决于调用函数的方式。只要我们不知道这一点,我们只能猜测什么是最好的解决方案。我考虑过使用它,但担心它实际上可能会创建对象的副本,而不仅仅是创建引用。谢谢大家!当然,你永远不可能创建一个“对象”,因为它覆盖了
对象
@ConnerRuhl——没问题^ ^ IAbstractDownvoteFactory——我知道,我刚刚离开了OP的帖子。我真的没有想到物体的名字。你的建议是不等价的
naba
被分配给
bar
,而不是对象。一般来说,我建议您根本不要使用
这个
原型
,因为它很容易出错。大多数人似乎完全误解了JavaScript的工作原理(以及它在没有原型的情况下工作)。如果您愿意,我可以发布一个不使用
this
prototype
@Frits的等效解决方案:我想我了解它的工作原理
naba
从未分配给
bar
,它被分配给该
所指的任何
。它很可能是构造函数的一个实例,但也可能是
window
。但是
这个
从来都不是
。如果您有一个构造函数,那么使用原型是附加实例方法(节省内存)的首选方法。我看不出这个
或原型容易出错。一开始可能很难理解,但这并不是什么神秘的事情。看来你是对的,这正是我的意思,
这个
令人困惑。下面是一个例子:@Fritz:this
所指的内容取决于函数的调用方式。有四种不同的方法。这意味着为了给出正确的答案,我们必须知道OP是如何调用所有这些函数的。也就是说,当您
Object
是函数而不是对象时。使用
new
进行尝试。我想这就是你想要展示的:(令人惊讶地工作)@Neal:当你调用
var obj=new Object()时;obj.bar();obj.naba()
然后它就会起作用,因为
这个
总是引用
obj
@Neal:拜托,我们的评论之间已经有25秒了。你检查过我每10秒刷新一次页面吗?;)@尼尔:是的,你的例子更好,但答案中的代码还是一样的。。。谢谢
function SomeObject() {
  this.foo = 0;
  this.bar = function () {
    this.naba = function () {
      alert(this.foo); // this works!
    }
  }
}