使用call()继承。为什么会一直存在?

时间:2018-04-03 09:24:04

标签: javascript prototypal-inheritance

我一直在使用javascript中的原型查看几个继承的例子。

虽然我理解它的主要部分,但我仍然不完全理解这些示例中为什么在调用 call()方法之后,当我们之后创建新实例时,它的效果仍然存在。

来自https://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/

的示例代码
var asCircle = function() {
  this.area = function() {
    return Math.PI * this.radius * this.radius;
  };
  this.grow = function() {
    this.radius++;
  };
  this.shrink = function() {
    this.radius--;
  };
  return this;
};

var Circle = function(radius) {
    this.radius = radius;
};
asCircle.call(Circle.prototype);
var circle1 = new Circle(5);
circle1.area(); //78.54

我认为call()在调用它的同一时刻分配了这个范围,并且只在那个时刻。 但是,在调用call()之后,我们创建了Circle(circle1)的实例,而circle1仍然“记住”使用Circle原型来使用asCircle方法。

每次创建实例时调用call()时,我都会更好地理解类似的方法。它就像是:

 var Circle = function(radius) {
        this.radius = radius;

        asCircle.call(this);
    };

我不太了解call()在被调用后是如何持续的?

这两个片段在继承方面会有什么不同吗?:

function Animal(name){
   this.name = name;
    this.speak = function(){ 
       console.log("my name is: " + this.name);
    }
};
function Cat(name) {
    this.catproperty = "whatever";
    Animal.call(this, name);
}
Cat.prototype = new Animal();

var cat = new Cat('Joe');
cat.speak();

function Animal(name){
    this.name = name;
    this.speak = function(){ 
       console.log("my name is: " + this.name);
    }
};

function Cat(name) {
 this.name = name;
 this.catproperty = "whatever";
}

Animal.call(Cat.prototype, );

var cat = new Cat('Joe');
cat.speak();

2 个答案:

答案 0 :(得分:1)

  

我认为call()在调用它的同一时刻分配了这个范围,并且只在那个时刻。

它为该函数调用设置this的值。

asCircle函数修改this引用的对象

函数运行完毕后,this的值消失了。价值的变化不会消失。

答案 1 :(得分:1)

asCircle和Circle,都是函数构造函数。当使用“new”运算符调用时,函数构造函数实例化新对象并设置构造函数内定义的对象的属性。

现在,当你编写下面的代码行

asCircle.call(Circle.prototype);

这意味着asCircle中的“this”将直接指向Circle函数的“proptotype”属性,从而修改它。因此,使用Circle函数构造函数(在本例中为circle1)创建的任何对象都可以访问修改后的prototype属性。

PS:在javascript中,当一个对象,函数或数组传递给任何方法时,它通过引用传递,并且可以通过它传递给它的方法永久地修改它。基元(字符串,整数等)按值传递。