这是一个很好的JavaScript对象模型吗? (电话簿项目)

时间:2009-04-28 21:23:24

标签: javascript object

我需要创建一个电话簿。感谢表格,我可以检索一个人的数据。我需要为此目的使用对象。我在一个方法的帮助下创建了一个phoneBook()对象,该方法可以在phoneBook中添加一个人 我决定(虽然没有要求)将“人”概念划分为2,这导致了一个“人”对象和一个“AddressPerson”对象(同一个人可以有两个房子:“我的裁缝很丰富! “:-))

这是声明Person对象的好方法吗?
我们可以创建一个没有地址的Person对象,然后像我对“Person2”对象一样添加它吗?

如果有人可以帮助我,我会非常感激。非常感谢你提前!“

function phoneBook(){
  this.Liste = new Array(); 
}

phoneBook.prototype.Add = function(){
   Liste.push(new Person(aLastName,aFirstName,aAddress));
}

function Person(aLastName,aFirstName,aAdd){
  this.LastName   = aLastName;
  this.FirstName  = aFirstName;
  this.Address = 
    new AddressPerson(aAdd.Street,aAdd.CP,aAdd.Town,aAdd.NumTel,aAdd.Email);
}

function Person2(aLastName,aFirstName){
  this.LastName   = aLastName;
  this.FirstName  = aFirstName;
  this.Address = 'unknow';
}

function AddressPerson(aStreet,aCP,aTown,aNumTel,aEmail){
  this.Street = aStreet;
  this.CP    = aCP;
  this.Town = aTown;
  this.NumTel = aNumTel;
  this.Email= aEmail;
}

7 个答案:

答案 0 :(得分:4)

一些建议:

  • 将您的班级(PhoneBook)更改为大写,并将您的方法/属性(lastNameadd())更改为小写
  • 不需要方法参数的'a'前缀,因为Javascript this永远不会被隐式使用。
  • 方法应将对象作为参数。例如,add()应为add(person),其中person是预先构建的Person对象。
  • 为什么需要Person2?这似乎是多余的。
  • Person的构造函数中,您复制Address的每个字段。一般只做this.address = address就行了。但是,如果您想确保每个Person都有自己的Address实例,请在clone()上提供Address方法。

答案 1 :(得分:1)

看看JSLint。这项工作有点像W3C的Markup Validator

JSLint由Douglas Crockford创建 - 雅虎! JavaScript传播者和发明JSON的家伙。

JSLint的全部内容:

  

“JSLint是一个JavaScript程序   在JavaScript中查找问题   程序

     

当C是一个年轻的节目   语言,有几个常见的   编程错误没有   被原始编译器捕获,所以   一个名为lint的配件程序   开发出来的扫描源   文件,寻找问题。

     

随着语言的成熟,   语言的定义是   加强了消除一些   不安全感,编译器变得更好   发出警告。皮棉不再   需要的。

     

JavaScript是一个年轻的年龄段   语言。它原本打算   在网页,任务中完成小任务   Java太沉重了   笨拙。但JavaScript是非常的   能干的语言,它现在正在   用于大型项目。很多人   旨在制作的功能   易于使用的语言   对于大型项目来说很麻烦。一个   需要lint for JavaScript:JSLint,   一个JavaScript语法检查器和   验证

     

JSLint采用JavaScript源代码   扫描它。如果发现问题,那就是   返回描述该消息的消息   问题和大致的位置   在源头内。问题不是   但是,必然是语法错误   它经常是。 JSLint看一些   风格约定以及   结构性问题。它没有证明   你的程序是正确的。它只是   提供另一组眼睛来帮助   现场问题。

     

JSLint定义了一个专业子集   JavaScript,一种更严格的语言   比第3版定义的那样   ECMAScript语言规范。该   子集与推荐相关   在代码约定中找到   JavaScript编程语言。

     

JavaScript是一种草率的语言,但是   里面有一个优雅,更好   语言。 JSLint可以帮助您编程   用那种更好的语言来避免   大部分污水。“

答案 2 :(得分:0)

您可以为更简洁的代码做一些事情,并遵循今天公认的最佳做法。

您可以更改此行

  this.Liste = new Array(); 

  this.Liste = []; // shorthand for creating an array. You can do the same with an object with {}

我通常使用JSON对象来做这类事情。 Douglas Crockford's JavaScript is a very useful resource.

答案 3 :(得分:0)

非常感谢
我改变了我的代码:

function PhoneBook(){<br>
    this.liste = [];<br>
}

PhoneBook.prototype.add = function(person){<br>
   this.liste.push(person);<br>
}

function Person(lastName,firstName,address){<br>
    this.lastName   = lastName;<br>
    this.firstName  = firstName;<br>
    this.address = address;<br>
}

function AddressPerson(street,cp,town,numTel,email){<br>
    this.street = street;<br<
    this.cp     = cp;<br>
    this.town   = town;<br>
    this.numTel = numTel;<br>
    this.email  = email;<br>
}

// tests for the others :-))

var phone = new PhoneBook();
alert(phone.liste.length);
var person = new Person(
    "aaaaaa",
    "bbbbbbb",
    new AddressPerson("zzzzz","87","rrrrr","22222","eeeee@uk.co")
);
alert(person.address.street);
phone.add(person);
alert(phone.liste.length);
alert(phone.liste[0].address.numTel);

但我不知道怎么做,Levik在答案中说:

  

但是如果你想确保每个人都有自己的地址实例,请在地址上提供 clone()方法

答案 4 :(得分:0)

这是我的建议:

function PhoneBook( person /*, ... */ ){
    this._liste = [];
}

PhoneBook.prototype.add = function(){
    var l = arguments.length;
    while(l--){
        this._liste.unshift( arguments[l] );
    }
}

function Person( p ){
    this.lastName   = p.lastName;
    this.firstName  = p.firstName;
    this.address    = p.address === 'unknown' ? new Address( p.address ) : 'unknown';
}

function Address( a ){
    this.street = a.street;
    this.CP     = a.CP;
    this.town   = a.town;
    this.numTel = a.numTel;
    this.email  = a.email;
}

答案 5 :(得分:0)

数据模型建议:

  • AddressPerson重命名为Address。您可以假设地传递与Address不对应的Person个对象。

  • 考虑将email字段移至Person - 正如您所提到的,您可能在一个地址有多个人(他们可能不一定共享电子邮件地址)。

  • 将完全初始化的Address传递给Person构造函数。

  • 删除Person2功能,并使address成为Person的可选属性。例如。作业变为this.address = (address === undefined) ? "unknown" : address;

从风格/会议的角度来看,levik的反应很好 - 我赞同这些建议。

答案 6 :(得分:0)

在我注册之前评论我自己的帖子评论:

  @harto-我认为不会改变   Person和Address构造函数   接受一个对象是一种改进。   这只是建造那些   对象不必要地复杂的IMO。   另外,我认为你的添加功能会   错过参数的第0个元素   阵列

我认为改变构造函数是好的,它允许自动克隆一个,如果你使用它,允许直接从JSON创建对象。无论如何,很多应用程序。如果需要,您可以随时进行参数长度验证并分析正确​​的行为。

对于add函数,它不会错过第0个元素,因为它是后递减的,这意味着表达式返回递减之前的值。这是你可以在javascript中设计的最快的循环。