关于昨天作业的答案
new 操作具体都干了什么
- 先创建了一个新的空对象
- 然后让这个空对象的proto指向Monkey函数的原型prototype
- 将Monkey函数对象的this指针替换成obj,然后再调用Monkey函数,于是就给obj对象赋值了一个id成员变量,这个成员变量的值是Monkey
备注:_ proto 是所有对象都有的属性,而这个属性的本身也是一个对象,它里面记载了他的父类的属性和方法。一个子类,都会有父类,对于一个简单的对象来说,它的 proto _就是null,new Object() 可以创建一个空的对象,你可以认为这个空对象是JS世界万物的起源
prototype 是函数的原型对象,每个函数都会有这个属性,但也只有函数会有,记录的是函数的父类,师傅说一般的函数研究它的父类都没有意义,因为都是null,但是有一类函数叫构造函数,它的意义在于构建一类对象,可以继承,所以子类构造函数的prototype属性就指向父类。 prototype 也是个对象,所以它也有 _ proto _ 属性。关于子类和父类继承关系的问题,我不是很能理解,师傅有给我举个例子,我也跟大家讲一讲,现在有个交通工具类,以它为父类,那么汽车类继承了交通工具类。同样汽车类构造出来的每个汽车对象的 _ proto _ 属性是不是也指向交通工具类。汽车的子类比如电动车,卡车等等。电动车继承了汽车类,那么电动车的prototype 就指向汽车类。现在我们就梳理出一个关系链:交通工具-汽车-电动车,这就是原型链
写在function Monkey里的属性(如name,age,sayHello)和写在prototype中的属性(如nickName,sayGoodbye)有什么区别
- 把方法写在prototype(原型)中的属性中比写在function Monkey(构造函数)里的属性中消耗的内存更小,因为在内存中一个类的原型只有一个,
写在原型中的行为可以被所有实例共享,实例化的时候并不会在实例的内存中再复制一份,而使用构造函数方式,每定义一个函数,也就实例化一个对象,
这样会无数次调用这个函数,所以没有特殊原因,我们一般把属性写到类中,而行为写到原型中- 构造函数中定义的属性和方法要比原型中定义的属性和方法的优先级高,如果定义了同名称的属性和方法,构造函数中的将会覆盖原型中的属性
如何让 Monkey类的hzw 调用 Mice类的mic 的saySomething方法
mic.saySomething.apply(hzw,['hzw',18])
备注:这里给大家延伸一下
call,apply和bind の 区别:
它们三个都能扭转this的指向:
call:call(对象,arg1,arg2....) 第一个是this。后边是要传的参数。
call方法
apply:apply(对象,[arg1,arg2,...]) apply跟call有些类似也可以有多个参数,但是不同的是,第二个参数必须是一个数组。
apply方法
bind:bind(对象,arg1,arg2,....)() bind跟call有些类似,但是不同的是,call会直接执行这个函数。bind不会,bind返回的是一个函数体,并不会直接执行函数,它会把修改后的函数返回给你,让你自己在需要的时候调用。
bind方法
bind方法返回的是一个修改过后的函数,所以我在下面加了(),执行了这个函数才输出了结果。
刚开始学着分享,可能有些分享还不够专业,希望有误的地方大家给在评论区指出,谢谢 !师傅讲遇到即了解,用过即掌握,这个要做到也挺难的,大家一起努力吧
网友评论