2013-02-25 12 views
7

Kann jemand erklären, warum ich verschiedene Werte von Selbst und dieses erhalten? Wo selbst ist ein Hinweis darauf.Javascript: Selbst und das

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

Ich habe selbst auf Projekt verwendet und es ist mein erstes Mal, dieses Problem zu haben.

+0

selbst und diese sind nicht mehr auf das gleiche Objekt beziehen. Der folgende Link kann hilfreich sein: http://stackoverflow.com/questions/962033/what-underlies-this-javascript-idiom-var-self-this –

+0

ô die Freude am Javascript Aufruf Kontext! – benzonico

+0

In 'func' scheint es, als ob" self "auf" Parent "zeigt, aber" this "zeigt auf" Child ". – Blender

Antwort

9

Dies liegt daran, self bezieht sich auf eine Instanz von Parent, aber nur Instanzen von Child haben eine a Eigenschaft.

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 

Also, wenn Sie func auf einer Instanz von Child nennen, bezieht sich this auf diese Instanz. Deshalb gibt this.a den richtigen Wert innerhalb func.

1

Innerhalb func bezieht sich this auf eine Instanz von Child.

Child.prototype.__proto__ = new Parent; 

Der Prototyp Child ist mit einer Instanz von Parent eingestellt. Also, wenn ch.func() aufgerufen wird, ist func() auf der Prototypkette von Child, wird aber im Rahmen der ch aufgerufen, die eine Instanz von Child

self bezieht sich immer noch auf die Instanz von Parent, die kein Attribut hat a

zur weiteren Veranschaulichung:

var p = new Parent(); 

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