Javascript 在不同上下文中访问类本身内部的引用

Javascript 在不同上下文中访问类本身内部的引用,javascript,Javascript,以下是指向JSFIDLE的链接: 我尝试使用作用域,将类构建放在包装器中,并在包装器中使用var self。在返回类的实例后,将其引用到var self,如下所示: function Foo(){ } Foo.prototype={ foo:'some text' ,bar:function(){ console.log('Want to be able to retrieve foo of Foo',this.foo); } } var insta

以下是指向JSFIDLE的链接:

我尝试使用作用域,将类构建放在包装器中,并在包装器中使用
var self
。在返回类的
实例后,将其引用到
var self
,如下所示:

function Foo(){

}
Foo.prototype={
    foo:'some text'
    ,bar:function(){
        console.log('Want to be able to retrieve foo of Foo',this.foo);
    }
}

var instance=new Foo();
instance.bar.apply({});
以下是指向JSFIDLE的链接:

但我的解决方案不好,因为每次我重建
类和它的原型方法

有更简单的解决方案吗?

请尝试以下方法:

function Foo() {
    var self;
    function Foo_in(){

    }
    Foo_in.prototype={
        foo:'some text'
        ,bar:function(){
            console.log('Want to be able to retrieve foo of Foo',self);
        }
    }
    return self=new Foo_in();
}

var instance=new Foo();
instance.bar.apply({});

使用这段代码,您可以在自动调用函数作用域中创建类,并在该作用域中声明self变量,以便在类方法中可以访问它,然后返回将分配给全局Foo变量的类的引用。通过这种方式,您可以获得对自变量的引用,并且只创建一次类。

您可以将
Foo.prototype
对象作为参数传递:

var Foo = (function () {
    var Foo_in = function (){};
    Foo_in.prototype={
        foo:'some text',
        bar:function(){
            console.log('Want to be able to retrieve foo of Foo',self);
        }
    }
    var self = new Foo_in();
    return Foo_in;
})();
所以

function Foo() {}

Foo.prototype = {
    foo: 'some text',
    bar: function ( proto ) {
        console.log( 'foo: ', proto ? proto.foo : this.foo );
    }
}

var instance = new Foo();
现场演示:


替代用途:

instance.bar() // 'some text'
instance.bar.apply( {}, [ Foo.prototype ] ) // 'some text'
现场演示:


更新:我对关闭解决方案的看法:

instance.bar() // 'some text'
instance.bar.apply( {}, [ instance ] ) // 'some text'
现场演示:

因此,
bar
方法使用
proto
引用来访问
foo


在条内执行
this.foo
无效(apply调用更改了
this
值,因此它不再指向实例)。因此,我们必须提供一个对原型对象的手动引用,该对象包含所需的
foo
值。最合适的方法是上面我的代码中提供的方法…

使用绑定函数:您不能使用
Foo.prototype.Foo
?这只是一个示例。如果它不在原型中呢?请避免标记标题和在帖子上签名。(OMG,200 to edit>。将
Foo_in.prototype
对象存储在
proto
变量中会更有意义。这就是它对我不起作用的原因。我只想在访问父上下文的同时能够使用另一个上下文。是的,它不起作用,因为self是类的一个实例,如果你想更改它的话属性必须更改自身实例,其他每个实例都是不同的object@Beck分配给
instance.foo
将对
foo.prototype.foo
值产生阴影。只有
instance
可以访问新值,因此如果您想通过使用
bar
访问该值,则需要传入
实例对象到
条中
…因此,结果是性能下降,使用我的初始解决方案,或者将不同上下文的初始实例作为参数传递到条()中已经忘记prototype了。Bug我想你是对的。唯一的解决办法是将实例本身作为参数传递。@Beck您试图访问的值-
'some value'
-被分配给
Foo.prototype.Foo
。因此,为了访问所需的值,prototype对象
Foo.prototype
。如果不想传入原型对象,可以传入实例:
instance.bar.apply({},[instance]);
-这也可以。。。
var Foo = (function () {
    function F() {}

    var proto = F.prototype = {
        foo: 'some text',
        bar: function () {
            console.log( 'foo: ', proto.foo );
        }
    }
    return F;
})();


var instance = new Foo();
instance.bar.apply( {} );