如何从父级调用prototype子方法

时间:2014-08-20 17:36:55

标签: javascript prototype

我想调用子对象方法表单原型对象:

function Hamster() {
    this.sleep = function(){
      console.log('sleep');
    }
}

Hamster.prototype = new function(){

    var _self = this;

    this.test = function(){
      this.sleep();
      //_self.sleep(); //not working
    }
}

lazy = new Hamster();
lazy.test();

为什么当我使用this.sleep()时一切正常,但当我使用_self.sleep()_self变量有this值)时,我会收到错误消息?为什么_self函数中的thistest()不相同?

4 个答案:

答案 0 :(得分:1)

this中存储的self引用与您在分配给this的匿名函数中调用的test()引用不同。关键是您正在创建和分配给this的函数的Hamster.prototype范围是一个空对象。这是因为您使用了new关键字。

Hamster.prototype = new function(){

    //Stores the reference to the empty object that's the scope of the anonymous 
    //function because it was called using the new keyword.
    var _self = this; 

    this.test = function(){
      //Works because the this keyword is a reference to Hamster.
      this.sleep(); 

      //Does not work because the empty object doesn't have a sleep method.
      //_self.sleep(); 
    }
}

答案 1 :(得分:1)

你对原型的运作方式感到困惑。

你可能只想要

Hamster.prototype = {
    test: function() {
        this.sleep();
    }
};

您正在做的是为原型创建一个新对象。您设置的_self变量不是指向单个Hamster对象的this,而是指向您正在创建的新原型对象的this,这对于世界而言是丢失的。

答案 2 :(得分:1)

让我们用一个返回两个东西的函数来编写它,让我们更容易地比较它们

function Constructor() {}

Constructor.prototype = new function () {
    var foo = this;
    this.bar = function () {
        return {"this": this, "foo": foo};
    };
};

var instance = new Constructor(),
    o = instance.bar();

现在测试一下我们有什么

o.this === instance; // true
o.foo === instance; // fase
// so what is o.foo ?
o.foo === Constructor.prototype; // true

这告诉我们什么?

  • 当我们从instance调用方法时,this引用该实例
  • 当我们使用new调用函数时,this引用由new创建的新对象实例;在这种情况下,我们将对象设置为Constructor
  • 原型

这些参考文献何时设定?

  • this中的instance.bar仅在实际调用instance.bar时设置
  • this中的new function () { ... }会在创建后立即设置,并且在此之后不会更改(您基本上使用了 IIFE ),它是还有new返回的内容,以及Constructor.prototype在此示例中设置的内容

答案 3 :(得分:0)

_self是你定义的匿名函数之外的局部变量,你没有通过它所以它没有在里面定义