使用原型(prototype)时 JavaScript 对象会被覆盖

标签 javascript object prototype

我有一个 Pers(on) 和一个从 Pers 派生的 Employee。

Pers = function(options){
  this.Name;
  this.ID;
  this.init = function(options){
    this.Name=options.Name;
    this.ID=options.ID;
  }
}

Employee = function(options){
  this.Sal;
  this.init = function(options){
    this.Sal=options.Sal;
    this.__proto__.init(options);
  }
  this.init(options);
}

Employee.prototype=new Pers();

现在当我创建新对象时...

var o=new Employee({Name:"Nik",ID:"1",Sal:100});
var p=new Employee({Name:"Tanja",ID:"2",Sal:200});

并提醒他们的名字,我会得到两次“Tanja”。

有人有想法吗?

最佳答案

this.__proto__.init(options);

将调用原型(prototype)上的init方法,原型(prototype)本身为this,导致您修改原型(prototype)。尝试一下

this.__proto__.init.apply(this, [options]);

编辑

为了避免 __proto__,您可以在隐藏原型(prototype) init 函数之前保存对它的引用:

Employee = function(options){
  this.Sal;
  var protoInit = this.init;
  this.init = function(options){
    this.Sal=options.Sal;
    protoInit.apply(this, [options]);
  }
  this.init(options);
}

关于使用原型(prototype)时 JavaScript 对象会被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11526560/

相关文章:

javascript - jQuery:还有另一种解决方案吗?

php - 自定义复选框在选中时不显示图像

javascript - 按键对对象数组进行分组

来自实例的 Javascript 原型(prototype)

Javascript 原型(prototype)属性

JavaScript:.extend 和 .prototype 有什么用?

javascript - 如何禁用滚动(溢出 :hidden) 除外

java - 单击 html 中的 anchor 调用文件下载 servlet?

javascript - 在遍历对象属性时删除对象属性是否安全?

Javascript:如何区分对象文字