关于继承

关于继承

组合继承:构造函数+原型对象模拟实现继承

call()

调用这个函数,并且修改函数运行的时this指向
fun.call(thisArg,arg1,arg2,…)

  • thisArg:当前调用函数this的指向对象
  • arg1,arg2:传递的其它参数
function fn(x,y){
     console.log('我要早起‘);
     }

var 0={
             name:'andy'
           };
  //1.call()可以调用函数
  fn.call();
  //2.call ()可以改变这个函数的this指向
  fn.call(o,1,2);

借用父构造函数继承属性

functon Father(uname,age,){
       //this指向父构造函数的对象实例
       this.uname=uname;
       this.age=age;
       }

function Son(uname,age,score){
        //this指向子构造函数的对象实例
        Father.call(this,uname,age,);
        this.score=score;(儿子也可以有自己的想法)
}
var son=new Son('小楠楠’,20,100);
console.log(son);

Father.call调用父构造函数,同时要让父构造函数中的this指向我们的子构造函数(因为这句代码写在子构造函数里面,子构造函数里的this就指向子构造函数里面的实例),加入属性就可以使用。

利用原型对象继承方法

functon Father(uname,age,){
       //this指向父构造函数的对象实例
       this.uname=uname;
       this.age=age;
       }
Father.prototype.money=function(){
            console.log('100');
            };

function Son(uname,age,score){
        //this指向子构造函数的对象实例
        Father.call(this,uname,age,);
        this.score=score;(儿子也可以有自己的想法)
}
var son=new Son('小楠楠’,20,100);
console.log(son);

在这里插入图片描述
我们给父构造函数写了一个方法,但是这个方法保存在原型对象中,所以子构造函数不能调用这个方法。
在这里我们也不能在子构造函数中添加Son.prototype=Father.prototype
这样我们的子构造函数虽然可以获得父构造函数的方法,但是Son原型对象也指向了Father原型对象,会将其覆盖掉,假如儿子要考试,则父亲也要考试,就是修改了子原型对象的话,父原型对象也会跟着一起变化。

子构造函数的专门方法

Son.prototype.constructor=Son;
Son.prototype=new Father();
在这里插入图片描述
这里需要注意的是,new Father是一个实例对象,它会覆盖掉原来原来的Son prototype,此时的Son prototype里面没有constructor了,这里需要给它指回去。
如果利用对象的形式来修改原型对象,要利用constructor指回原来的构造函数。

继承是面向对象编程中的重要概念,以下是关于继承的一些正确说法: 在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。子类对象拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的,可以继承,只是无法访问到而已[^1]。 在C++中,除了public成员、protect成员、private成员之外还有“不可访问成员”。public继承后,基类中的私有成员在派生类中成为了“不可访问成员”,这是一个和私有成员不同的概念[^3]。 以下为Java继承示例代码: ```java class Parent { Parent() { System.out.println("调用父类构造方法!"); } private static void staticParent() { System.out.println("调用父类静态方法"); } private final void finalParent() { System.out.println("调用父类final方法"); } private void printParent() { System.out.println("调用父类私有方法"); } } class Child extends Parent { public void printChild() { System.out.println("调用子类公有方法"); } } public class Test { public static void main(String[] args) throws Exception { // 获取子类 Class clazz = Class.forName("work.litao.Child"); // 得到父类 Class superClass = clazz.getSuperclass(); // 得到父类非继承的所有方法 java.lang.reflect.Method[] methods = superClass.getDeclaredMethods(); // 设置私有方法可以被访问 java.lang.reflect.AccessibleObject.setAccessible(methods, true); for (java.lang.reflect.Method m : methods) { System.out.println(); System.out.println("子类调用方法" + m.getName() + "()的调用结果: "); m.invoke(new Child()); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值