JS-原型和原型链

先声明一个构造函数

function People(name,age){
        this.name = name;
        this.age = age;
    }

把类的方法写在构造函数原型对象中,子类就不能再通过调用父类构造函数来继承方法(属性还是可以继承)

// 给People的原型添加方法
People.prototype.speak = function(){
        console.log("我是"+this.name);
    }
// 创建子类继承People
function Man(name,age,huzi){
        People.call(this,name,age);
        this.huzi = huzi;
    }

(People和Man的属性和方法都可以输出和调用查看,代码里就不展示测试代码了)

这时候怎么让Man去继承People的方法?

Man.prototype = People.prototype;
    Man.prototype.smoke = function(){
        console.log("抽烟");
    }

然而这样并不对!不能直接把子类的prototype指向父类的prototype,这样会导致两个构造函数共用一个prototype,其中的方法父类子类的对象都可访问,而正确的情况应该是子类可以访问父类的方法,而父类不能访问子类的方法

对象的原型也是对象,所以原型也有原型.

当访问一个对象的方法时,如果对象中存在则直接访问,如果不存在则在对象的原型中寻找,有则访问,没有则在原型的原型中寻找,如果还没有则继续网上寻找,直到找到Object位置

Object是一个类(构造函数),这个类的对象的原型没有原型

对象的原型,与原型的原型组成的链式结构叫做原型链

子类要继承父类的方法,则需要把子类的构造函数的prototype对象的原型(__proto__)设置为父类构造函数的prototype

那么就是这么写:

Man.prototype.__proto__ = People.prototype;

这样写可以,但官方给的有个更好标准的写法(这样写并没错)

// Object.create用于指定原型创建一个对象(空对象)
    Man.prototype = Object.create(People.prototype);
    Man.prototype.smoke = function(){
        console.log("抽烟");
    }

子类继承父类时,除了可以扩展新的方法,还可以重写父类已有的方法,当使用子类对象调用重写的方法时,会执行子类自己的方法

Man.prototype.speak = function(){
        console.log("我是男性");
    }

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值