原型式继承的constructor指向问题

让我们先来了解一下constructor

  1. constructor属性不影响任何JavaScript的内部属性。
  2. constructor 的含义是 返回指向创建了该对象原型的函数引用.
  3. instanceof检测对象的原型链,通常你是无法修改的(不过某些引擎通过私有的__proto__属性暴露出来)。
  4. constructor其实没有什么用处,只是JavaScript语言设计的历史遗留物。
  5. 由于constructor属性是可以变更的,所以未必真的指向对象的构造函数,只是一个提示。
  6. 不过,从编程习惯上,我们应该尽量让对象的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方法在原型链上加的位置不一样了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值