2013-02-25 3 views
7

Может ли кто-нибудь объяснить, почему я получаю разные значения себя и этого? Где само это ссылка на это.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(); 

Я использую сам проект, и это мой первый раз, когда у меня есть эта проблема.

+0

самостоятельно, и это уже не со ссылкой на тот же объект. Следующая ссылка может быть полезна: http://stackoverflow.com/questions/962033/what-underlies-this-javascript-idiom-var-self-this –

+0

ô радость контекста вызова javascript! – benzonico

+0

В 'func', кажется, что' self' указывает на 'Parent', но' this' указывает на 'Child'. – Blender

ответ

9

Это потому, что self относится к экземпляру Parent, но только экземпляры Child имеют свойство 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 

Так что, когда вы звоните func на примере Child, this относится к этому экземпляру. Вот почему this.a дает правильное значение внутри func.

1

В пределах func, this относится к экземпляру Child.

Child.prototype.__proto__ = new Parent; 

Прототип Child установлен на экземпляр Parent. Поэтому, когда ch.func() вызывается, func() на цепи прототипов Child, но вызывается в контексте ch, который является экземпляром Child

self еще со ссылкой на экземпляр Parent, который не имеет атрибут a

чтобы дополнительно проиллюстрировать:

var p = new Parent(); 

// this.a is undefined because this is an instance of Parent 
p.func(); // undefined undefined 
Смежные вопросы