让我们先来了解一下constructor
- constructor属性不影响任何JavaScript的内部属性。
- constructor 的含义是 返回指向创建了该对象原型的函数引用.
- instanceof检测对象的原型链,通常你是无法修改的(不过某些引擎通过私有的__proto__属性暴露出来)。
- constructor其实没有什么用处,只是JavaScript语言设计的历史遗留物。
- 由于constructor属性是可以变更的,所以未必真的指向对象的构造函数,只是一个提示。
- 不过,从编程习惯上,我们应该尽量让对象的constructor指向其构造函数,以维持这个惯例。
class Person {
}
class Friend extends Person {
}
console.log('%O', Person.prototype.constructor); // Person
console.log('%O', Friend.prototype.constructor); // Friend
//Friend.prototype.constructor = Friend
//原先Friend.prototype.constructor指向的是Person
//但是感觉并没有什么用有没有弹出的结果都一样,感觉都很好完成了继承
//但是在后续实例化等过程中不会直接使用到constructor,但是出于对该函数本身的含义的理解,于是我们修正了constructor。
修正constructor是为了保证它能按照constructor被设计的意义一样正确的指向构造函数,如果constructor正确指向构造函数,就意味着能获取到构造函数的prototype,拿到prototype,你就可以为所欲为了,但是又因为constructor的指向不是强制的,所以如果你要用constructor做什么事要小心,因为它一不定严格指向该对象的构造函数,所以这边你修改不修改没有什么强制性。
var f = (function() {
function Person() {
}
function Friend() {
}
Friend.prototype = new Person();
// Friend.prototype.constructor = Friend;
return new Friend();
}())
// 如果需要扩展原型方法
f.constructor.prototype.sayHello = function() {
console.log('hello');
}
f.sayHello(); // hello
console.log(f);
通过上面的例子可以看出修正了的constructor
与没有修改的差别是扩展的sayHello
方法在原型链上加的位置不一样了。