javascript proto-chaining对此的困惑

时间:2017-08-06 19:27:35

标签: javascript

转到教程代码下面

Animal = function(name) {this.name = name}
Animal.prototype.eats = function(){
      return this.name + ' is eating'
}

Chordate = function(name){Animal.call(this,name)}

我理解call是如何工作的(基本上,在这种情况下,这会变成this)...但我的问题是,如何使用它? 对不起,我理解原型是如何工作的......但实际上,一旦你按照上面的方式设置Chordate,我就不明白..如何使用它? 这有用吗?或者您现在如何指定this? 有人可以解释w /例吗?

3 个答案:

答案 0 :(得分:1)

创建指向Animal原型方法的链接:

Chordate.prototype = Object.create(Animal.prototype)

然后new

var c = new Chordate('my name');

c.eats();

Animal.call(this,name)就像调用基础构造函数一样。它执行Animal构造函数并传入name,但使用正确的this上下文:

Animal = function(name) {
    // "this" will be your Chordate instance
    this.name = name
}

答案 1 :(得分:0)

让我们假设您构建了一个动物:

 new Animal();

在施工期间,它会在画布上绘制一种新动物。构造函数看起来像这样:

 function Animal(){
   canvas.draw(this.x,this.y,this.image);
  }

现在你有了一只老虎。如果它被建造,老虎应该咆哮。

 function Tiger(){
   this.roar();
 }

现在?它是一种动物,所以它添加到画布对吗?不可以。由于js继承系统,您需要手动执行此操作。因此,当虎被构建时,您还需要将其构建为动物:

 Animal.call(this);

使用新的类语法更容易:

 class Animal{
   constructor(){
     this.draw(this.x,this.y,this.image);
   }
}

class Tiger extends Animal{
  constructor(){
    this.roar();
    super()//construct Animal
  }
}

答案 2 :(得分:0)

这只是对其他答案的补充,对评论来说太长了。

也许它可以帮助您理解new运算符实际执行的操作:

var newInstance = new ConstructorFunction(arg1, arg2);
  1. 创建一个新对象。该对象的原型是ConstructorFunction.prototype
  2. var newInstance = Object.create(ConstructorFunction.prototype);
    
    1. 使用新创建的对象调用ConstructorFunction
    2. ConstructorFunction.call(newInstance, arg1, arg2);
      

      如果ConstructorFunction继承自另一个"类",则必须调用其超级构造函数。这就是以下代码的作用:

      function Parent () {
        // this === newInstance
      }
      
      function Child () {
        // this === newInstance
        Parent.call(this); // call the super constructor
      }
      
      Child.prototype = Object.create(Parent.prototype);
      
      var newInstance = new Child();
      // or:
      var newInstance = Object.create(Child.prototype);
      Child.call(newInstance); // call the constructor, which calls the super constructor