javascript - 为什么我的 javascript Backbone.js 模型共享其父类的相同 "instance"?

标签 javascript backbone.js prototypal-inheritance

编辑:修复我的示例以演示该行为。

我希望 AbstractParent 的 details 属性成为我所说的“实例属性”,但它更像是一个“静态属性”。我意识到这些术语不适合 javascript,那么为什么当我创建一个新的子类时它没有获得自己唯一的 AbstractParent 原型(prototype)?为什么他们共用一个?

在下面的代码中,我希望得到一个空警报,但我得到的却是“新的详细信息”

var AbstractParent = Backbone.Model.extend({
  details: [],

  addDetail: function(detail) {
    this.details.push(detail);
  },

  getDetails: function() {
    var rtn = '';
    for(var i=0;i<this.details.length;i++) {
      rtn += this.details[i];
    }
    return rtn;
  }
});

var Child = AbstractParent.extend({});

var ch1 = new Child;
ch1.addDetail("new details");
var ch2 = new Child;

alert(ch2.getDetails()); // => 'new details'

这似乎只在 details 是数组时才有效。如果它是字符串或对象,则它不会被 ch1ch2 共享。

最佳答案

好的,我想通了这个问题。我原来问题的代码不准确,所以我向其他响应者道歉(他们在我提供的代码的上下文中是正确的)。

这里描述了解决方案: Javascript object members that are prototyped as arrays become shared by all class instances

基本上,两个 Child 实例共享同一个 AbstractParent 函数作为其原型(prototype)这一事实意味着对 AbstractParent 中的任何更改都将反射(reflect)在两个子实例的原型(prototype)中。

这仅在使用数组时才出现的原因是因为我在原型(prototype)中初始化了数组,然后只是更改它而不是在 addDetail 函数中覆盖它。当我使用对象或字符串作为属性名称然后进行赋值时,函数调用时上下文中的 this 属于 Child 实例,因此 this.name = 'Billy'; 在 AbstractParent 函数中实际上是将其附加到 Child 实例,而不是在 AbstractParent 中。我在想每个 Child 实例都会得到自己的 AbstractParent 原型(prototype)实例,当我访问 this.name 时,它​​不会在 Child 上找到它,而是会转到 this.prototype.name

在我问题的代码中,我可以通过向实例化详细信息数组的 AbstractParent 添加一个 initialize 函数来解决此问题。但是,如果我向 Child 添加一个 initialize 函数并且我没有调用其中的父构造函数,那么我会遇到与以前相同的问题。

关于javascript - 为什么我的 javascript Backbone.js 模型共享其父类的相同 "instance"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143745/

相关文章:

internet-explorer - 有没有任何 Backbone 友好的方法来检测后退按钮按下情况?

javascript - JS中的类继承和私有(private)变量

javascript - 为什么表单元素中的 Javascript 会失败?

javascript - 类型为 ="module"的 javascript 文件是否都相互隔离?

javascript - Node JS Puppeteer headful 浏览器无法启动

jquery - 扩展 javascript 库(underscore、jquery、backbone 等)

javascript - php多维数组到javascript无法通过循环访问

javascript - Backbone 良好的模型结构

意外设置 Javascript 对象实例属性

javascript - JavaScript 中的原型(prototype)继承问题