在不同的上下文中访问Class内部的引用

时间:2011-12-28 13:36:32

标签: javascript

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({});

这是jsfiddle的链接:

http://jsfiddle.net/dnJFt/1/

我正在尝试使用范围将类构建在其中包含var self的包装器中。返回instance of Class后,请将其引用至var self

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({});

这是jsfiddle的链接: http://jsfiddle.net/dnJFt/2/

但我的解决方案很糟糕,因为每次我重建Class并且它是原型方法。

有更简单的解决方案吗?

2 个答案:

答案 0 :(得分:0)

尝试这种方式:

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;
})();

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

答案 1 :(得分:0)

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

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'

现场演示: http://jsfiddle.net/wpyZN/


替代用法:

instance.bar() // 'some text'
instance.bar.apply( {}, [ instance ] ) // 'some text'

现场演示: http://jsfiddle.net/wpyZN/1/


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

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( {} );

现场演示: http://jsfiddle.net/KT7vU/

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

在栏内执行this.foo不起作用(apply-invocation更改了this值,因此它不再指向实例)。因此,我们必须提供原型对象的手动引用,该对象保存所需的foo值。最合适的方法是在上面的代码中提供的方法......