使用.prototype的简单方案

时间:2011-01-21 15:40:35

标签: javascript prototype

2个问题:

  1. 下面,Code A和代码B会有 同样的结果?
  2. 阅读@ Box9的答案后

    ADDITION 代码A与代码C怎么样?

    1. 什么是简单,实用, 代码A的直观编码方案 首选技术?
    2. 代码A:使用.prototype

      function employee(name,jobtitle,born)
      {
          this.name=name;
          this.jobtitle=jobtitle;
          this.born=born;
      }
      
      employee.prototype.salary=null;
      

      代码B:没有.prototype

      function employee(name,jobtitle,born)
      {
          this.name=name;
          this.jobtitle=jobtitle;
          this.born=born;
      
          employee.salary=null;
      }
      

      代码C:使用.prototype,

      内没有任何内容
          function employee(){}
      
      employee.prototype.name=null;    
      employee.prototype.jobtitle=null;
      employee.prototype.born=null;
      employee.prototype.salary=null;
      

      提前道歉,我意识到在.prototype和许多网络教程上还有其他SO问题,但是这些解释似乎过于简单化或仅仅是技术上的问题。

2 个答案:

答案 0 :(得分:3)

在您的示例中,代码A是正确的,而代码B则不是。

为了解释,我们可以从三个不同方面考虑employee

  1. “标准”员工 - 所有新员工共有的默认值集。这是我们创建新员工的模式。例如。新员工的工资从零开始。
    • 这是prototype
  2. “特定”员工 - 比如说,约翰。他最初以空薪(来自“标准”员工)开始,但他可以在以后获得自己的薪水。他也有自己的名字,职称和生日,这对他来说是独一无二的。
    • 使用this函数中的关键字employee()分配唯一属性。
  3. 员工作为一个群组 - 为每位员工存储的一揽子价值,但同时为所有员工存储,例如所有员工均来自A公司。
    • 这是直接在函数employee上设置属性。
  4. 现在回到你的两个代码示例,

    代码A中的

    employee.prototype.salary = null是正确的,因为它正在设置“标准”员工的起薪。

    代码B中的

    employee.salary = null不正确,因为它将所有员工的薪水设置为一个组 - 即它不仅是一个默认值,而是一个单个,所有员工的一揽子价值。此代码在employee()函数内部并不重要 - 函数的唯一区别在于它允许您使用this关键字来引用当前正在使用的“特定”员工由于调用new employee()而构建。

答案 1 :(得分:1)

首先,代码A和B将有不同的结果。代码A具有对象的构造函数,并向其原型添加属性。这意味着employee的所有实例都将有一个名为salary的字段,该字段为空。与原型属性的正常行为一样,如果这些实例中的任何一个写入属性,它将为该对象创建一个本地副本。

所以,使用代码A:

var e = new employee('Bob', 'janitor', 1978);
alert(e.salary);  // null

var f = new employee('Alice', 'teacher', 1976);
f.salary = 20000;

alert(f.salary);  // 20000
alert(e.salary);  // null

在代码B的情况下,雇员的任何实例都不会将薪水作为财产,但构造者将例如employee.salary将存在,并且更像是经典继承中的静态类变量。如果您想为所有实例提供一个值,例如,可以这样做employee.RETIREMENT_AGE = 65,但你通常会在构造函数之后执行此操作,而不是在其中(您重复分配相同的东西)。