2个问题:
ADDITION :代码A与代码C怎么样?
function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}
employee.prototype.salary=null;
function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
employee.salary=null;
}
function employee(){}
employee.prototype.name=null;
employee.prototype.jobtitle=null;
employee.prototype.born=null;
employee.prototype.salary=null;
提前道歉,我意识到在.prototype和许多网络教程上还有其他SO问题,但是这些解释似乎过于简单化或仅仅是技术上的问题。
答案 0 :(得分:3)
在您的示例中,代码A是正确的,而代码B则不是。
为了解释,我们可以从三个不同方面考虑employee
:
prototype
。this
函数中的关键字employee()
分配唯一属性。employee
上设置属性。现在回到你的两个代码示例,
代码A中的 employee.prototype.salary = null
是正确的,因为它正在设置“标准”员工的起薪。
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
,但你通常会在构造函数之后执行此操作,而不是在其中(您重复分配相同的东西)。