自推对象构造函数

时间:2013-11-24 00:19:48

标签: javascript oop

因此,JavaScript是一种函数式语言,类是从函数定义的,函数作用域对应于类构造函数。经过相当长的一段时间研究如何在JavaScript中进行OOP后,我现在全力以赴。

我想做的不一定是可能的,所以我首先要知道这是不是一个好主意。所以假设我有一个数组和类如下:

var Entry = function(name, numbers, address) {
  this.name = name;
  if(typeof numbers == "string") {
    this.numbers = [];
    this.numbers.push(numbers);
  }
  else this.numbers = numbers;
  this.address = address;
};

var AddressBook = [];

我使用以下功能添加联系人:

function addContact(name, numbers, address) {
  AddressBook.push(new Entry(name, numbers, address));
}

我不能这样做new Entry()会将本身加入AddressBook吗?如果我不能在创建时执行此操作,那么使用Entry原型中的方法来执行此操作会很有趣。我无法想办法做任何类似的事情。

2 个答案:

答案 0 :(得分:7)

您可以尝试将AddressBook数组引用传递给函数,如:

var Entry = function(name, numbers, address, addressBook) {
  this.name = name;
  if(!(numbers instanceof Array)) {
    this.numbers = [numbers];
  }
  else this.numbers = numbers;
  this.address = address;
  addressBook.push(this);
};

var addressBook = [];

function addContact(name, numbers, address) {
  new Entry(name, numbers, address, addressBook)
}

答案 1 :(得分:3)

重新考虑设计方法。 “Entry”对象的主要角色是信息持有者。您应该将AddToAddressBook功能封装在某种控制器或eventHandler中。

<强>详情 你有一个以上的责任,把这两个问题紧紧联系起来通常不是一个好主意。 (例如,设计原则涉及单一责任原则和关注点分离。)

信息持有者 - 旨在了解某些信息并将该信息提供给其他对象的对象。

Structurer - 维护对象与关系之间关系的对象。

我建议阅读SOLID原则,并尽量保持每个对象的责任。您的代码将更简单,更易于维护和扩展。

结帐 - http://aspiringcraftsman.com/series/solid-javascript/
有一个产品和购物车的例子非常接近您的情况。