Javascript 在嵌套的文本对象中绑定此对象

Javascript 在嵌套的文本对象中绑定此对象,javascript,this,bind,object-literal,Javascript,This,Bind,Object Literal,假设我有这个代码 (function() { function Foo(arg) { this.name = arg; } Foo.prototype = { bar: { baz: function() { alert(this.name); // Undefined... } } } var foo = function

假设我有这个代码

(function() {

    function Foo(arg) {
        this.name = arg;
    }

    Foo.prototype = {
        bar: {
            baz: function() {
                alert(this.name); // Undefined...
            }
        }
    }

    var foo = function(arg) {
        return new Foo(arg);
    };


    window.foo = foo;

    return foo;
}());

foo("Anything").bar.baz();

如何在我的函数“baz”中使“this”指的是对象Foo,而在我从外部调用它时不使用bind或apply?

FWIW,我强烈建议不要像那样构建嵌套结构,或者至少不要在原型上构建嵌套结构,因为
对象在所有实例中都是共享的,这为许多串扰风格的bug打开了大门。相反,我会在构造函数中创建

当我从外部调用函数“baz”时,如何在不使用bind或apply的情况下使函数“this”引用对象Foo


您可能对
绑定
应用
/
调用
有点困惑。调用函数时不使用
bind
,而是在创建函数时使用。除非您使用
bind
(或与之等效的东西),否则您不能做您所说的您想要做的事情,因为如果没有
bind
(或类似的东西),
这个
是通过调用函数的方式来设置的,因此
this.bar.baz()
将在调用中使
this
成为
this.bar

下面是如何在构造函数中构建
,并使用
bind
使
baz
使用正确的

function Foo(arg) {
    this.name = arg;
    this.bar = {
        baz: function() {
            alert(this.name);
        }.bind(this)            // <== Note
    };
}
函数Foo(arg){
this.name=arg;
此.bar={
baz:function(){
警报(此名称);

}.bind(this)/在声明时使用bind来适当地限定此范围,例如

function foo() {}.bind(this);

这个
是通过调用函数的方式来设置的。因此,除非您使用类似于
.bind()
的方法来替换它,否则它是通过调用它的方式来设置的,并且因为
baz
bar
的方法,当您调用
baz
作为
bar.baz()
这个
将是
。一般来说,所有的嵌套方法都要在同一个父对象上操作,就像这样,这比它的价值要麻烦得多,因为你必须不断地重置
这个
。你可以修改它来工作,但这不是语言设计的工作方式。郭台铭能解释一下你在做什么吗ng to do?@jfriend00我知道在这个例子中它指的是“bar”,而“this”总是取决于函数的调用方式。但是我想用这个结构来访问“name”属性。你为什么要这样做呢?这不是一个自然的Javascript设计模式。你可以使用各种方法强制它,但这不是JS的本意Write.OP正在寻找一种不使用bind或apply的方法,如question@PatrickEvans:OP说“…当我从外部调用它时,不使用绑定或应用…”这对我来说意味着他们不太清楚
bind
的作用。我不认为这对OP有什么帮助。出于你提到的原因,我很乐意使用
prototype
,那么有没有一种方法可以使用这种结构呢?@user3292788:不,你不能让一个
bar
对象在一个实例中共享一个single
baz
属性指的是一个函数,该函数使用不同的
this
值,而不使用
apply
call
。这感觉很像X/Y问题:你想做X,你就想到了Y(条形代码/baz
的东西)关于如何做X,我们正在问如何做Y。我建议发布一个新的问题,问如何做X(在实例之间共享信息或其他什么)。这不是你想做的。希望这能有所帮助!