首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >设置实例化的类属性将覆盖所有实例中的属性

设置实例化的类属性将覆盖所有实例中的属性
EN

Stack Overflow用户
提问于 2010-05-30 09:27:35
回答 1查看 125关注 0票数 0

我有一个类的两个实例。在第一个实例中设置属性也会在第二个实例中设置该属性。为什么?不应该是。这个属性不是“原型属性”。

检查下面的代码,Peter Griffin会发生什么?创建了两个对象,并将其命名为"Peter Griffin“和"Roger Moore”,但警告框将显示"Peter Moore“和"Roger Moore”。彼得·格里芬怎么了?

代码语言:javascript
代码运行次数:0
运行
复制
var BaseClass = function(){
    this.name = "";
    this.data = {};
    this.data.lastname = "";
}
var ExtendedClass = function(){
    this.setName = function(fname, lname){
        this.name = fname;
        this.data.lastname = lname;
    }
    this.hello = function(){
        alert("Full name: " + this.name + " " + this.data.lastname);
    }
}
ExtendedClass.prototype = new BaseClass();

pilot = new ExtendedClass();
driver = new ExtendedClass();

pilot.setName("Peter", "Griffin");
driver.setName("Roger", "Moore");

pilot.hello();  // Full name: Peter Moore
driver.hello(); // Full name: Roger Moore
EN

回答 1

Stack Overflow用户

发布于 2010-05-30 10:27:24

您不需要在ExtendedClass构造函数中分配新的this.data= {}。因此,每个ExtendedClass实例都从其原型BaseClass实例继承data对象。这是一个单独的Object!从一个实例向其写入lname,所有实例都将看到更改。

JavaScript的构造函数和原型混乱不堪。您通常不希望使用实例(由缺失的参数构造)作为类的基础。这只是将导致的众多错误中的一个。

此外,在ExtendedClass中,构造器为每个实例编写一个新的、独立的hello方法,而不是像通常使用原型那样在实例之间共享相同的函数。

您可能被一些写得很差的JS OOP教程代码搞糊涂了,这并不奇怪,因为大多数示例都非常糟糕。请参阅this question获取(long!)讨论JS中各种更一致的面向对象方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2937209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档