2015-09-17 46 views
1

这个问题已经被提出并且提出的解决方案是使用'bind'。但是如何在这种情况下使用“绑定”?在原型中保留'this'上下文

var Fun = function(){ 
    this.count = 100; 
} 

Fun.prototype.f = function(){ 
    console.log("in f : " + this.count); 
} 

Fun.prototype.g = { 
    f : function(){ 
     console.log("in g-f : " + this.count); 
     // Is it possible to use 'bind' here to access 'this' of 'Fun' 
    } 
} 

fun = new Fun(); 
fun.f(); // Results - in f : 100 
fun.g.f(); // Results - in g-f : undefined 
fun.g.f.bind(fun)(); // Results - in f : 100 

是否有可能使用bind在这样g.ffun.g.f()会给结果in f : 100

+1

@NEB:这是不可能的,那些是两个不同的对象。 – zerkms

回答

6

是否可以使用“捆绑”这里访问'这个“乐”

没有,因为没有this到要创建的第二f点绑定。你必须做的,而不是Fun

var Fun = function(){ 
    this.count = 100; 
    this.g = { 
     f: function() { 
      console.log("in g-f : " + this.count); 
     }.bind(this) 
    }; 
}; 

或者不绑定:

var Fun = function(){ 
    var t = this; 
    this.count = 100; 
    this.g = { 
     f: function() { 
      console.log("in g-f : " + t.count); 
     } 
    }; 
}; 

这并不涉及创建为每个实例的新功能。现代浏览器引擎将在实例之间重用函数的代码,即使创建了不同的函数对象

如果你想使从原型中使用f主体,这也是可能的:把g的原型,你所展示的,则:

var Fun = function(){ 
    var t = this; 
    var oldg = this.g; 
    this.count = 100; 
    this.g = { 
     f: function() { 
      return oldg.f.apply(t, arguments); 
     } 
    }; 
}; 

现在,如果后Fun.prototype.g.f变化实例已创建,则使用更新后的版本。但是,如果Fun.prototype.g被替换为对新对象的引用,则会中断。

+0

谢谢,我知道这个解决方案。但正如你所说,我试图避免“为每个实例创造新功能”。 – NEB

+0

@NEB:您基本上不能使用ES6的“代理”功能 - 这也可能涉及每个实例创建一个函数(以处理代理回调)。 –

+0

@NEB这是一个'非常优化'的场景,尽管它确实会产生一些轻微的簿记费用。这在使用'private'方法的代码结构中很常见(或者需要维护一个特定的绑定)。除非处理{插入一些相关的值}数千个对象,否则我甚至不会眨眼睛这种方法做了我需要/希望它做的事情。 – user2864740

1

不,因为fun.g是一个不同的对象。你所能做的就是在Fun的所有实例中放入不同的g对象,并在其中放入一个绑定函数f

function Fun() { 
    this.count = 100; 

    this.g = { 
    f: function() { 
     console.log("in g-f : " + this.count); 
    }.bind(this); 
    }; 
} 

Fun.prototype.f = function() { 
    console.log("in f : " + this.count); 
}; 
相关问题