Javascript为什么要分配函数的原型构造函数来自行运行? Programmer.prototype.constructor = Programmer

时间:2014-11-24 09:36:14

标签: javascript prototype

以下是执行此操作的代码

function Person() {
    this.klass = 'human';
}

Person.prototype.toString = function () {
    return this.klass;
};

Person.prototype.greeting = function () {
    return 'hello everyone Im ' + this.name + ', my job is ' + this.klass + '。';
};

function Programmer(name) {
    this.name = name;
    this.klass = 'coder';
}

Programmer.prototype = new Person();
Programmer.prototype.constructor = Programmer;


var someone = new Programmer('sam');

someone.name;          // sam
someone.toString();    // coder
someone.greeting();    // hello everyone Im sam my job is coder

我在在线教程中看到了这段代码片段,但我想知道这项任务的目的是什么:

Programmer.prototype.constructor = Programmer;

我已经尝试删除此作业,一切正常。

2 个答案:

答案 0 :(得分:1)

constructor属性存在于原型对象中,而原型对象又是您的对象引用的。当你通过这样做Programmer.prototype = new Person();修改原型对象时,存储在实际原型中的构造函数属性会丢失,因为你要覆盖原型对象本身。

所以这一行Programmer.prototype.constructor = Programmer;确保你指向正确的构造函数(换句话说,就是你从中创建对象的正确父对象)。

除了一些调试目的以了解创建新对象的实际对象之外,它没什么意义。 需要注意的一点是,因为有人可以轻松覆盖

Programmer.prototype.constructor = Tester;

如果您的任何功能依赖于构造函数属性来识别实际的父级,则应格外小心,因为它不是万无一失的。

答案 1 :(得分:1)

差别很小。唯一值得注意的是,通常通过检查.constructor属性来完成类型检查(Javascript在尝试模拟OOP时不是很好)。您测试if (someone.constructor === Programmer)

如果您移除Programmer.prototype.constructor = Programmer;行,则someone.constructor实际上是Person,因此当您进行测试以查看它们是否为Programmer时,它将会失败。

Programmer函数重新分配为.constructor方法会为您带来该功能。

要自己查看,只需将console.log( someone.constructor === Programmer, someone.constructor === Person );添加到脚本的末尾,然后尝试删除并添加该行。