【问题标题】:Javascript Why assign a function's prototype's constructor to function itself ? Programmer.prototype.constructor = Programmer [duplicate]Javascript 为什么将函数原型的构造函数分配给函数本身? Programmer.prototype.constructor = 程序员 [重复]
【发布时间】:2015-01-21 23:26:58
【问题描述】:

这是执行此操作的代码

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

我从在线教程中看到了这段代码 sn-p,但我想知道这个作业的目的是什么:

Programmer.prototype.constructor = Programmer;

我试过删除这个作业,一切正常。

【问题讨论】:

标签: javascript prototype


【解决方案1】:

差别很小。唯一需要注意的是,类型检查(当您尝试模拟 OOP 时 Javascript 并不擅长)通常是通过检查 .constructor 属性来完成的。你测试if (someone.constructor === Programmer)

如果你去掉Programmer.prototype.constructor = Programmer;这一行,那么someone.constructor实际上就是Person,所以当你测试它们是否是Programmer时,它会失败。

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

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

【讨论】:

    【解决方案2】:

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

    因此Programmer.prototype.constructor = Programmer; 这一行确保您指向正确的构造函数(换句话说,您从其创建对象的正确父对象)。

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

    Programmer.prototype.constructor = Tester;
    

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

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2018-02-09
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多