因此,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
原型中的方法来执行此操作会很有趣。我无法想办法做任何类似的事情。
答案 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/
有一个产品和购物车的例子非常接近您的情况。