ES6类,构造函数继承,call,apply,bind的区别,原型链

ES6类:关键字(class)

 

 此时,一个简单的class类继承就好了,此时hg可以去用父类中的方法,在上面我们通过extends关键字实现继承

 如果我们要给子类新添加一个属性,子类必须在constructor方法中调用super方法,否则会报错,super会默认自带子类的this指向,super访问对象的父类中的构造函数,改变this指向,super使用时要在this之前去使用,否则会报错.

当子类不需要父类中的方法时,也可以自己添加方法,不会影响父类.

说到这个我们可以看看静态方法,通过Start.jump添加jump这个方法,或者我们通过static jump来添加静态属性,则这个方法不会被实例化对象继承,而是直接通过类名.方法名来调用,同样的,子类也需要通过子类名.方法名去调用这个属性 ,子类的实例化对象也不能调用这个jump方法

总结:静态方法只能函数自己来调用,它的实例对象不能调用,而实例方法只能通过它的实例对象来调用,它本身不能调用

构造函数继承:这是ES6 Class没有之前常用的继承方式

 

当我们在用构造函数实例化对象的时候,我们每一次调用这个构造函数的时候,在new的这个过程中在堆里面开辟空间,改变this指向,然后把地址给在栈里面的这个变量,而我们每一次在利用Father实例化对象的时候,都相当于在堆里面呢开辟了空间,而里面的方法都是相同的,那我们就造成了不必要内存消耗,所以我们何不想个办法,让他实例化出来的对象都可以访问这个空间,或者说这个空间是一个公共的空间,只要是通过这个Father实例化出来的对象都可以访问,这时候我们就想到了Father的原型对象(Father.prototype )了,我们把这个方法加到这个原型对象上,那这样我们就可以实现刚刚的想法了,也就是说我们让我们的Father.prototype里面有一个我们想要的公共的一个方法, 这时候我们每当通过这个构造函数实例化出来的对象都可以访问这个空间,那此时我们就解决了刚刚的那个问题,那如果我们要去继承父构造函数的方法该怎么办呢?请看下面

如果我们直接去给Son.prototype = Father.prototype,这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化,所以我们先去利用父构造函数new一个对象,则这个对象有了父构造函数的方法和属性同时也可以访问到父构造函数的原型对象,然后把这个对象付给子构造函数的原型对象,那么此时我们通过子构造函数中来实例出来的对象,就可以用这个方法了,因为我们利用了对象的形式修改了原型对象,所以别忘了利用constructor 指回原来的构造函数

call,bind,apply的区别:

Call:

1,call()可以调用函数

2,call()可以修改this的指向,使用call()的时候 参数1是修改后的this指向,参数2,参数3使用逗号隔开连接

3,call方法一般用作做于继承

 

 apply:

 

1,apply()可以调用函数

2,apply()可以修改this的指向,使用apply()的时候 参数1是修改后的this指向,后面需要传的参数是数组

3,apply()方法经常跟数组有关系

 

bind:

 

1,bind()不可以调用函数

2,bind()可以修改this的指向,使用bind()的时候 参数1是修改后的this指向,后面需要传的参数是数组

3,bind()方法使用的时候不会调用函数,返回的是改变this指向的新函数

总结:

相同点:

        都可以改变this指向

不同点:

        apply和call都可以调用函数,apply调用函数传参时,使用数组的方式,而call传参时,传递参数使用逗号隔开

        bind不会直接调用函数,只会改变函数中的this指向,

使用场景:

call方法一般是用作继承

apply方法一般都是用作与数组有关的

bind方法一般是用来当你不想调用函数,又想改变this指向

原型链:

每个实例对象都有一个__proto__属性,指向的是构造函数的原型对象,原型对象也有一个__proto__属性,这样一层一层往上找就形成了原型链

接下来我们介绍下构造函数和构造函数的原型对象,构造函数的实例化对象的三角关系

上面说到,实例对象有一个属性是__proto__,原型对象也有一个__proto__和constructor属性,所以就有了下面这张图中的原型关系

构造函数实例和原型对象的三角关系

        1,构造函数实例出来的对象可以通过  对象名.__proto__找到原型对象

        2 构造函数实例出来的对象可以通过  对象名.__proto__.constructor找到构造函数

        3, 构造函数可以通过  构造函数的名字.prototype找到原型对象

        4,原型对象可以通过 构造函数的名字.prototype.constructor 找到构造函数

原型链和成员的查找机制

 上面的图中,我们只给Object的原型对象给了一个求和的方法,并没有给这个zgr给求和的方法,那他是怎么样拿到3的呢?这就要说到我们的原型链查找机制了,每个对象都会自带一个__proto__,当你访问一个对象的属性或者方法时,如果他自身没有,就会通过__proto__去往上一级找,也就是__proto__指向的原型对象,如果还没有继续通过__proto__往上面找,如果Object的原型对象上还是没有这个方法或者属性,以此类推,直到返回null,其实__proto__存在的意义就是给每个对象指了一条路或者说一个方向

                                          感谢观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值