javascript - node.js 中类实例之间的共享数组

标签 javascript arrays node.js oop

我在 node.js 中遇到了一个奇怪的问题:

person.js

var Person;

Person = (function() {
  Person.prototype.name = "";
  Person.prototype.friends = [];

  function Person(name) {
    if (name) {
      this.name = name;
    }
  }

  Person.prototype.sayHello = function() {
    return console.log("Hello, my name is " + this.name + " and I have " + this.friends.length + " friends");
  };

  Person.prototype.addFriend = function(name) {
    this.friends.push(name);
  };

  return Person;

})();

module.exports = Person; 

factory.js

var Person = require('./Person.js');

module.exports = function(name) {
  return new Person(name);
};

index.js

factory = require('./factory');

tyrion = factory("Tyrion");
tyrion.addFriend("Bronn");
tyrion.sayHello();
daenerys = factory("Daenerys");
daenerys.addFriend("Illyrio");
daenerys.addFriend("Daario");
daenerys.addFriend("Barristan");
daenerys.sayHello();
tyrion.sayHello();

实际输出

Hello, my name is Tyrion and I have 1 friends
Hello, my name is Daenerys and I have 4 friends
Hello, my name is Tyrion and I have 4 friends

预期输出

Hello, my name is Tyrion and I have 1 friends
Hello, my name is Daenerys and I have 3 friends
Hello, my name is Tyrion and I have 1 friends

为什么向一个实例添加元素会同时为两个实例添加元素? friend 数组似乎在实例之间“共享”。如何预防?

Demo here

最佳答案

删除行

Person.prototype.name = "";
Person.prototype.friends = [];

改为将它们添加到构造函数中:

this.name = name;
this.friends = [];

目前所有原型(prototype)共享同一个对象 friends

关于javascript - node.js 中类实例之间的共享数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25814271/

相关文章:

javascript - jQuery 获取 HTML 值并查找和替换内容中的 $ 或 £

javascript - 使用 `Math.PI` 如何在每个元素中设置我自己的 Angular 值?

javascript - 如何将初始页面的 url 保存为 js 中的变量并在提交表单后使用它?

arrays - 字典中的多个参数

javascript - 在使用 requireJs 调用的方法中使用 Node require

javascript - 如何进行异步调用以发送一个信号推送通知

javascript - 在javascript中只计算工作时间

javascript - 为什么我的 JavaScript 数组显示两个元素计数,而实际上应该只有一个元素?

c# - Array.Copy --> 不支持大于 2GB 的数组

javascript - Node.JS 服务器未发送数据(或客户端未接收)