自推式对象构造函数

Self-pushing object constructor

本文关键字:构造函数 对象      更新时间:2023-10-02

所以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吗?如果我不能在create上做到这一点,那么在Entry原型中使用一个方法也会很有趣。我想不出类似的办法。

您可以尝试将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)
}

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

详细信息你有不止一个责任,通常把这两个问题紧密结合在一起不是一个好主意。(例如,设计原则涉及单一责任原则和关注点分离。)

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

结构化器–一个维护对象之间关系以及有关这些关系的信息的对象。

我建议阅读SOLID原则,并尽量将每个对象的责任集中在狭窄的范围内。您的代码将不那么复杂,更易于维护和扩展。

退房-http://aspiringcraftsman.com/series/solid-javascript/
这里有一个产品和购物车的例子,非常接近您上面的场景。