【问题标题】:Is this a good JavaScript object model? (phone book project)这是一个好的 JavaScript 对象模型吗? (电话簿项目)
【发布时间】:2009-04-28 21:23:24
【问题描述】:

我需要创建一个电话簿。多亏了一个表格,我可以检索一个人的数据。我需要为此目的使用对象。我借助一种方法创建了一个 phoneBook() 对象,该方法可以在 phoneBook 中添加一个人。
我决定(虽然没有被要求)将“人”概念分为 2,从而产生“人”对象和“地址人”对象(同一个人可以有两个房子:“我的裁缝很有钱! " :-))

这是声明 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;
}

【问题讨论】:

    标签: javascript object


    【解决方案1】:

    一些建议:

    • 将您的类 (PhoneBook) 更改为大写,并将您的方法/属性 (lastName, add()) 更改为小写
    • 不需要方法参数上的“a”前缀,因为在 Javascript 中this 从未隐式使用。
    • 方法应该将对象作为参数。例如,add() 应该是 add(person),其中 person 是预先构造的 Person 对象。
    • 为什么需要Person2?这似乎是多余的。
    • Person 的构造函数中,复制Address 的每个字段。通常只做this.address = address 就可以了。但如果你想确保每个Person 都有自己的Address 实例,请在Address 上提供clone() 方法。

    【讨论】:

      【解决方案2】:

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

      JSLint 由道格拉斯·克罗克福德(Douglas Crockford)创建——雅虎! JavaScript 布道者和发明 JSON 的家伙。

      什么是 JSLint:

      "JSLint 是一个 JavaScript 程序 查找 JavaScript 中的问题 程序。

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

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

      JavaScript 是一个年轻的时代 语言。原本是打算 做网页中的小任务,任务 Java 太重了 笨拙。但是 JavaScript 是一个非常 有能力的语言,现在正在 用于较大的项目。许多 打算制作的功能 易于使用的语言是 对于大型项目来说很麻烦。一种 需要 JavaScript 的 lint:JSLint, JavaScript 语法检查器和 验证器。

      JSLint 采用 JavaScript 源代码和 扫描它。如果它发现问题,它 返回一条消息,描述 问题和大概位置 源内。问题不是 必然是语法错误,虽然 它经常是。 JSLint 看一些 样式约定以及 结构性问题。它不能证明 你的程序是正确的。这只是 提供另一双眼睛来帮助 发现问题。

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

      JavaScript 是一种草率的语言,但是 里面有一个优雅的,更好的 语言。 JSLint 帮助你编程 用那种更好的语言,避免 大部分垃圾。”

      【讨论】:

        【解决方案3】:

        对于更简洁的代码,以及遵循当今公认的最佳实践,您可以做一些事情。

        你可以改变这一行

          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.

        【讨论】:

          【解决方案4】:

          这是我的建议:

          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;
          }
          

          【讨论】:

          • 也感谢您的回答,但对不起,我现在是凌晨 3 点 30 分,我明天会测试!
          • 我不认为将 Person 和 Address 构造函数更改为接受对象是一种改进。这只会使这些对象的构造变得不必要地复杂 IMO。另外,我认为您的 add 函数会丢失参数数组的第 0 个元素?
          【解决方案5】:

          非常感谢
          我这样更改了我的代码:

          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 在他的回答中说:

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

          【讨论】:

          • OUPS! function AddressPerson(street,cp,town,numTel,email){
            this.street = street;
            this.cp= cp;
            this.town = town;
            this.numTel = numTel;
            this.email = 电子邮件;
            }
          • 没有
            标签:对不起,对不起!函数 AddressPerson(street,cp,town,numTel,email){ this.street = street;这个.cp = cp; this.town = 城镇; this.numTel = numTel; this.email = 电子邮件; }
          • OUPS!函数 AddressPerson(street,cp,town,numTel,email){ this.street = street;这个.cp = cp; this.town = 城镇; this.numTel = numTel; this.email = 电子邮件; }
          • 嗨 gmatu - 您可以通过单击 cmets 上方的“编辑”链接来编辑您的答案。
          【解决方案6】:

          数据模型建议:

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

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

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

          • 删除Person2 函数,并将address 设为Person 的可选属性。例如。分配变为this.address = (address === undefined) ? "unknown" : address;

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

          【讨论】:

            【解决方案7】:

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

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

            我确实认为更改构造函数很好,它允许自动克隆一个,如果您使用它,则允许直接从 JSON 创建对象。无论如何,大量的应用程序。如果需要,您始终可以进行参数长度验证并根据正确的行为进行分支。

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

            【讨论】:

              猜你喜欢
              • 2011-02-16
              • 2011-02-17
              • 1970-01-01
              • 1970-01-01
              • 2011-05-30
              • 1970-01-01
              • 2020-01-29
              • 1970-01-01
              • 2019-04-09
              相关资源
              最近更新 更多