我一直在使用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();
答案 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中,当一个对象,函数或数组传递给任何方法时,它通过引用传递,并且可以通过它传递给它的方法永久地修改它。基元(字符串,整数等)按值传递。