JavaScript原型继承中的 constructor

转载请注明出处----在河东

    砖头书中有道: 在默认情况下,所有原型对象都会自动获得一个 Constructor (构造函数)属性,这个属性
是指向prototype 属性所在函数的指针。  (听起来确实有点懵逼)
    书中示例:
function    Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = functon(){
    console.log(this.name);
}

大概就说明了constructor是指向它的类的(默认情况下)
图片描述

好了,下面我们来看看下面的继承:


    function SuperType(name){
        this.name = name;
        this.colors = ["red","blue","green"];
    }
    SuperType.prototype.sayName = function(){
        console.log(this.name);
    }
    function SubType(name , age){
        SuperType.call(this,name);
        this.age = age;
    }
    /**12行*/SubType.prototype = new SuperType();
    //留意下面这一句的作用
    SubType.prototype.constructor = SubType;
    SubType.prototype.sayAge = function(){
        console.log(this.age);
    }
    var instance1 = new SubType("HEDONGHUI",22);
    instance1.colors.push("black");
    console.log(instance1.colors);
    instance1.sayName();
    instance1.sayAge();

    var instance2 = new SubType("heod",23);
    console.log(instance2.colors);
    instance2.sayName();
    instance2.sayAge();

注释掉 SubType.prototype.constructor = SubType; 后的结果:

clipboard.png

会发现,去掉这句instance1 , instance2 还是能调用Subtype类构造函数并能成功得出想要的结果。那么问题来了,这句话在原型继承中的作用是什么呢?

从前文我们知道,原型的constructor 默认指向原对应的类型。第12行执行完后,SubType原型(SubType.prototype)
指向了SuperType的实例对象,而SuperType的实例对象的构造器是构造函数SuperType,所以
SubType.prototype.constructor就是构造对象SuperType了(换句话说,SuperType构造了SubType的原型)。







clipboard.png

这里实例instance1 ,SubType.prototype.constructor都为 SuperType。这就导致了
SubType.prototype === instance1.constructor.prototype 为false; 这样会令人产生费解,既然在一开始中
(前文)说到原型指向所在的类型,一般情况下,instance1.constructor为SubType 。 SubType.prototype ===
SubType.prototype的。 由于第12行代码实现了,SubType 继承 SuperType导致了 SubType.prototype.constructor
指向了SuperType(),因此,这行代码的作用就是为了修正因为继承SuperType对象所有成员后,SubType的构造器也指向了SuperType.

那么,为什么注释掉也能正确调用SubType()构造函数去实例化instance1呢?

虽然instance1.constructor ===SuperType() 返回true, 但对于执行第12行来说,SubType.prototype实例化了
继承来的父类的方法和属性。在 instance1 = new SubType("heodnghui",22)中,instance1.__proto__由于
SubType.prototype指向了SuperType 而被修改为 SuperType。 因此也获得了父类继承来的属性和方法
(尽管constructor也指向了SuperType)
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值