我有一个类的两个实例。在第一个实例中设置属性也会在第二个实例中设置该属性。为什么?不应该是。这个属性不是“原型属性”。
检查下面的代码,Peter Griffin会发生什么?创建了两个对象,并将其命名为"Peter Griffin“和"Roger Moore”,但警告框将显示"Peter Moore“和"Roger Moore”。彼得·格里芬怎么了?
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
发布于 2010-05-30 02:27:24
您不需要在ExtendedClass
构造函数中分配新的this.data= {}
。因此,每个ExtendedClass
实例都从其原型BaseClass
实例继承data
对象。这是一个单独的Object
!从一个实例向其写入lname
,所有实例都将看到更改。
JavaScript的构造函数和原型混乱不堪。您通常不希望使用实例(由缺失的参数构造)作为类的基础。这只是将导致的众多错误中的一个。
此外,在ExtendedClass
中,构造器为每个实例编写一个新的、独立的hello
方法,而不是像通常使用原型那样在实例之间共享相同的函数。
您可能被一些写得很差的JS OOP教程代码搞糊涂了,这并不奇怪,因为大多数示例都非常糟糕。请参阅this question获取(long!)讨论JS中各种更一致的面向对象方法。
https://stackoverflow.com/questions/2937209
复制