首页 > 经典继承的一个疑问

经典继承的一个疑问

<script>
    function Animal(age)
    {
        this.age = age;
    }
    Animal.prototype = {
        constructor:Animal,
        bark:function(){
            alert(this+'is barking');
        }
    }
    //....
    function extend(){
            var F = new Function();
            F.prototype = Animal.prototype;
            Dog.prototype = new F();
            //还原子类构造器
            Dog.prototype.constructor = Dog;
        };
    extend();
    function Dog(sex,age)
    {
        this.sex = sex;
        Animal.call(this,age);

        
    }
    dog = new Dog('boy','23');
    console.log(dog.sex + dog.age );
    dog.bark();
</script>

此处的代码为什么要生成 F这一个空函数作为一个临时中转,不直接使用 Dog.prototype = Animal.prototype呢?


现在也可以使用Object.create实现继承,dog.prototype=Object.create(animal.prototype)不会造成dog.prototype和animal.prototype指向同一片内存的情况。


关于js的继承,实现的方式有几种,最好不要去对应面向对象诸如Java,C#之类的继承(而且,现在很多的前端框架都在弱化继承,因为js是基于原型的)。

我也写过一个js的继承(部分代码):

pm.extend=function(sp,ext){
    //
    if(!utils.isFunction(sp)){
        
        return utils.extend.apply(this,slice.call(arguments,0));
    }
    var F=function(){
        
        //call the constructor
        F.superclass.constructor.apply(this,slice.call(arguments,0));          
    };
    
    //
    F.prototype=new sp();
    //
    utils.extend(F.prototype,ext);
    //
    F.prototype.constructor=sp;
    
    sp=ext.constructor !=ObjectProto.constructor ? ext.constructor : sp.prototype.constructor;
    F.superclass=sp.prototype;
    if(F.prototype.constructor === ObjectProto.constructor){
        
        F.prototype.constructor=F;
    }
    
    return F;
};

js的继承会导致出现几个问题,constructor改变,prototype指向出现问题,通过instanceof得不到你想要的继承关系等。

你这里,那个F函数就是为了解决prototype指向的问题的(可以看看相关的书籍,在这里推荐一下月影的《JavaScript王者归来》)

对于js的继承这个东东,建议还是停留在学习,了解上,可以看看一些常见的面向对象的js的设计,比如Extjs(这个用于学习js相关的很有用),Dojo等。


你直接把Dog.prototype = Animal.prototype,这时假如我的Dog.prototypeAnimal.prototype指向的是同一片内存,那么就意味着一个改变就会影响另外一个,所以采取这种方式,为Dog.prototype重新开辟内存。


如果父子的 prototype 都指向一个相同的对象,如果子对象的 prototype 的属性被修改,那么就会影响到父对象。所以用一个中介 new F() 来改变这个情况。


直接使用 Dog.prototype = Animal.prototype
这样的话,Dog.prototype更改了,则会引起Animal.prototype更改,这肯定不合你的要求吧?

【热门文章】
【热门文章】