以下是执行此操作的代码
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;
我已经尝试删除此作业,一切正常。
答案 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 );
添加到脚本的末尾,然后尝试删除并添加该行。