gpt4 book ai didi

javascript:具有继承的基对象中变量的行为

转载 作者:行者123 更新时间:2023-11-29 10:49:47 25 4
gpt4 key购买 nike

function Resource(){ 
var id = '';

this.getId = function(){
return id;
}

this.setId = function(value){
id = value;
}
}

function Model(){ }
Model.prototype = new Resource();

为了测试上面的代码,我有以下内容:

var m1 = new Model();
m1.setId("blah");
alert("m1 = " + m1.getId());

var m2 = new Model();
m2.setId("blahblah");
alert("m2 = " + m2.getId());

alert("m1 = " + m1.getId());

我希望收到以下警报:m1 = blah, m2 = blahblah, m1 = blah

但是,显示以下内容:m1 = blah, m2 = blahblah, m1 = blahblah

我写了上面的代码作为一个实验,这样我就可以开始理解 JavaScript 中的继承。也许我对应该显示的内容的期望是由于我的 Java/C# 背景。显然,每个新创建的 Model 对象都共享 Resource 中定义的相同 id 变量。为什么是这样?

我如何编写此代码,以便每个新模型都可以拥有自己唯一的 id(除了显而易见的 - 在模型中定义)?

顺便说一句,我特意将 id 定义为 var id 而不是 this.id,因为我正在寻找私有(private)变量行为。

最佳答案

原型(prototype)对象在所有实例之间共享。

因为 id 变量属于 Resource 构造函数,并且因为 Modelprototype 是单一的Resource 的实例,所有 Model 实例都使用该单个实例,因此使用相同的变量。

要让每个 Model 实例都有自己的 id 变量,您需要在 Model 中创建 id 变量 构造函数,以及访问器方法。

function Model() {
var id = '';

this.getId = function(){
return id;
}

this.setId = function(value){
id = value;
}
}

实现此目的的另一种方法是使用 Model 实例作为上下文来调用 Resource。这是使用 .call.apply 完成的,如下所示:

function Model() {
Resource.apply(this);
}

这将调用 Resource 函数,该函数将创建 id 变量及其访问器方法,但访问器将分配给 Model 实例。

关于javascript:具有继承的基对象中变量的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12676442/

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