Javascript 在不同上下文中访问类本身内部的引用
以下是指向JSFIDLE的链接: 我尝试使用作用域,将类构建放在包装器中,并在包装器中使用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
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( {} );