Javascript: Self и это

может кто-нибудь объяснить, почему я получаю разные значения и это? Где ссылка на это.

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

Я использую self в проекте, и это мой первый раз, чтобы иметь эту проблему.

4 ответов


это так 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.


внутри 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

var myObject = {
    foo: "bar",
    func: function() {
        var self = this;
        console.log("outer func1:  this.foo = " + this.foo); //bar
        console.log("outer func2:  self.foo = " + self.foo); //bar
        (function() {
            console.log("inner func3:  this.foo = " + this.foo); //undefind
            console.log("inner func4:  self.foo = " + self.foo);//bar
        }());
    }
};
myObject.func();

function Foo() {
  this.bar = 'bar';
  return this;
}
Foo.prototype.test = function(){return 1;}



function Bar() {
  this.bro = 'bro';
  return this;
}
Bar.prototype.test2 = function(){return 2;}

function Cool2() {
  Foo.call(this);
  Bar.call(this);

  return this;
}
//console.log(Object.create(Bar.prototype));
var combine = Object.create(Foo.prototype);
//console.log(combine);

$.extend(combine, Object.create(Bar.prototype));
$.extend(combine, Object.create(Foo.prototype));

Cool2.prototype = Object.create(combine);
//Cool2.prototype.constructor = Cool2;

var cool = new Cool2();
 

console.log(cool.test()); // 1
console.log(cool.test2()); //2
console.log(cool.brow) //bro
console.log(cool.bar) //bar
console.log(cool instanceof Foo); //true
console.log(cool instanceof Bar); //false


 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>