javascript面向对象二-“继承”(二)

2014-11-24 01:36:56 · 作者: · 浏览: 1
); } // public field this.x = "I'm a subClass object field!";
    // public method
    this.method2 = function() {

        alert(x);

        alert(this.x);
        method2();
    }
   this.method3 = function() {
        method1();
    }
} 
// test
var o = new subClass(); 
alert(o instanceof parentClass);    // false
alert(o instanceof subClass);       // true 
//通过call 继承,子类的实例化对象只属于子类,不属于父类。
alert(o.constructor);  // function subClass() {...} 同原型继承,constructor属性属于子类
o.method1();    // I'm a parentClass field!

                // I'm a subClass object field!

                // I'm a parentClass field!
                // I'm a parentClass method!

//父类中继承来的公有变量,方法,都可以被访问到。

o.method2();    // I'm a subClass field!

                // I'm a subClass object field!
                // I'm a subClass field!

                // I'm a subClass method! 
//子类可以随意调用自己的方法和变量

o.method();                // error定义在父类原型上的方法,不会被子类继承。

o.method3();               //error 子类中定义的实例方法同样不能访问父类中定义的私有实例成员的。

subClass.staticMethod();   //error 静态成员同样不会被继承的

 

PS:思考下面的代码,得出两点:

alert(o instanceof parentClass); // false

alert(o instanceof subClass); // true

对比原型继承,这里的 o不属于父类,为什么,我认为call调用这种方法不是真正意义上的继承,就是“调用”,也有另一种叫法:对象冒充,即不是真正的继承,真实可以通过这个途径访问到到另一类的共有方法,变量。所以子类对象不属于父类;这是其一,不同的其二:通过调用继承法,可以实现多继承。既然是调用,那么一个类调用多个类是OK的。一个子类可以从多个父类中继承通过 this 方式定义在父类内部的所有公有实例成员。


两种方法对比

原型继承:只继承属性.不能传参,不能共享?Son.Prototype=newfather();

调用继承(对象冒充):只能继承构造函数中的信息(传参),不能继承属性(共享)。father.call(this,pro1,pro2);

小结:在实际应用当中,我们可以根据的自己的不同需要,可以将两种方法结合来使用,满足不同方法,原型的的访问,这样即达到了属性共享,方法又独立的目的。有这么几种:

组合模式(原型+构造函数)(属性共享,方法独立)

寄生式继承(原型式+工厂方法)