2013-02-25 33 views
7

Czy ktoś może wyjaśnić, dlaczego dostaję różne wartości jaźni i to? Gdzie self jest odniesieniem do tego.Javascript: Self and This

function Parent(){ 
    var self = this; 
    this.func = function(){ 
     // self.a is undefined 
     // this.a is 'Test' 
     console.log(self.a, this.a); 
    } 
} 

function Child(x){ 
    this.a = x; 
} 

Child.prototype.__proto__ = new Parent; 
var ch = new Child('Test'); 
ch.func(); 

Używałem samodzielnego projektu i po raz pierwszy mam ten problem.

+0

siebie i to nie są już odnosząc się do tego samego obiektu. Poniższy link może być pomocny: http://stackoverflow.com/questions/962033/what-underlies-this-javascript-idiom-varself-this –

+0

ô radość kontekstu połączenia javascript! – benzonico

+0

W 'func', wydaje się, że' self' wskazuje na 'Parent', ale' this' wskazuje na 'Child'. – Blender

Odpowiedz

9

To dlatego self odnosi się do wystąpienia Parent, ale tylko przypadki Child mają właściwość a.

function Parent(){ 
    var self = this; // this is an instance of Parent 
    this.func = function(){ 
     console.log(self.a, this.a); 
    } 
} 

function Child(x){ 
    this.a = x; // Instances of Child have an `a` property 
} 

Child.prototype.__proto__ = new Parent; 
var ch = new Child('Test'); 

ch.func(); // Method called in context of instance of Child 

Więc kiedy zadzwonisz func na wystąpienie Child, this odnosi się do tej instancji. Dlatego this.a podaje poprawną wartość wewnątrz func.

1

W ciągu func, this odnosi się do instancji Child.

Child.prototype.__proto__ = new Parent; 

Prototyp Child jest ustawiony do instancji Parent. Więc kiedy ch.func() jest wywoływany, func() jest na łańcuchu prototypu Child, ale jest wywoływana w kontekście ch który jest instancją Child

self wciąż odnosząc się do wystąpienia Parent który nie posiada atrybut a

aby dodatkowo zilustrować:

var p = new Parent(); 

// this.a is undefined because this is an instance of Parent 
p.func(); // undefined undefined