javascript - js组合继承中斧正constructor的指向有什么用。
阿神
阿神 2017-04-10 17:55:12
[JavaScript讨论组]

Friend.prototype.constructor = Friend
原先Friend.prototype.constructor指向的是Person
但是感觉并没有什么用

有没有弹出的结果都一样,感觉都很好完成了继承

function Person(name,age){
            this.name = name;
            this.age = age;
            if(typeof this.sayName != 'function'){
                Person.prototype.sayName = function(){
                    alert(this.name);
                }
            }
        }
        
        var per1 = new Person('zhang',23);
        var per2 = new Person('wagn',23);

        
        function Friend(name,age,sex){
            Person.call(this,name,age);
            this.sex = sex;
        } 
            Friend.prototype = new Person();
            Friend.prototype.constructor = Friend; //不斧正时,constructor指向Person
            Friend.prototype.saySex=function(){
                alert(this.sex);
            }
        
        var fri1 = new Friend('wang','11','nan');
        var fri2 = new Friend('li','55','nv');

        alert(Person.prototype.constructor);
阿神
阿神

闭关修行中......

全部回复(6)
巴扎黑

ES6class语法理解应该会好一点,手机回复,可以先参考mdn,如果不能理解,稍后补全。


更新:
看完其它评论才发现自己理解基础知识也是有时没有太深入,导致一时也不能很好的回复这个问题,但是既然回复了,还是好好的编辑一下自己理解的答案。
用ES6简化了下:

    class Person {

    }

    class Friend extends Person {

    }
    
    console.log('%O', Person.prototype.constructor); // Person
    console.log('%O', Friend.prototype.constructor); // Friend

ES6中已经修复了这个constructor,始终指向类本身
用ES5简化下:

    function Person() {
    
    }
    
    function Friend() {
    
    }
    
    Friend.prototype = new Person();
    // Friend.prototype.constructor = Friend;
    console.log('%O', Person.prototype.constructor); // Person
    console.log('%O', Friend.prototype.constructor); // Person

为什么Friend.prototype.constructor也是Person,这里题主是知道的。我还是自己学习再次总结下,因为实例化Person类时返回的对象中的constructorPerson本身,但是在后续实例化等过程中不会直接使用到constructor,但是出于对该函数本身的含义的理解,于是我们修正了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方法在原型链上加的位置不一样了。

ringa_lee

constructor作用

关于constructor的修正,我想关乎到其后续使用吧,同时我觉得这也保证了面向对象的合理性吧,保持constructor指向自家构造器的特征

巴扎黑

绝大多数情况是不用修正的,但是如果在不修正的情况下你这么写 new Friend.prototype.constructor()返回的并不是一个Friend对象而只是Person对象。

怪我咯

就好像保洁公司生产了两款洗发水,一款叫海飞丝,另一款没有名字。
那么别人只能通过保洁找到那款没名字的洗发水。
直到后来那款没名字的说自己叫飘柔,大家才知道去超市找飘柔洗发水。

怪我咯

修正constructor是为了保证它能按照constructor被设计的意义一样正确的指向构造函数,如果constructor正确指向构造函数,就意味着能获取到构造函数的prototype,拿到prototype,哈哈那你就可以为所欲为了,但是又因为constructor的指向不是强制的,所以如果你想要用constructor做什么事要小心,因为它一不定都是严格指向该对象的构造函数,所以这边你修改不修改没有什么强制性。


function a(){this.a ='hello'};//构造函数a,它的prototype.constructor指向它自己
var aa = new a();
var bb = new a();
aa.constructor.prototype.say =  function(){console.log(this.a+'!')};//通过a的实例aa查询到a的constructor,也就是a本身,然后修改a的prototype,可以为所有a的实例都创建方法bb
bb.say();//bb也有了say方法,输出"hello!"

建议看下这个:https://www.zhihu.com/questio...

伊谢尔伦

如果不通过construtor来创建对象应该是不用进行斧正的吧,它指向了对象的原始构造函数。就像每个人都要追本溯源一样,对于对象也是如此,这是为了充分实现面向对象的编程机制吧。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号