gpt4 book ai didi

javascript - 使用 call() 进行继承。为什么它会持续存在?

转载 作者:行者123 更新时间:2023-12-01 02:13:03 25 4
gpt4 key购买 nike

我一直在回顾几个在 javascript 中使用原型(prototype)继承的示例。

虽然我理解了它的主要内容,但在这些示例中我仍然不完全理解为什么在调用 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 原型(prototype)来使用 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();

最佳答案

I thought that call() assigned this scope in the same moment it is invoqued, and only in that moment.

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

asCircle 函数修改 this 引用的对象

函数运行结束后,this 的值消失。值的更改不会消失。

关于javascript - 使用 call() 进行继承。为什么它会持续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49626528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com