call()和原型继承的方法

1.call()

call()方法接受两个参数,obj和arg 

比如functionA.call(obj,arg)   就是说现在运行(执行)functionA这个方法,但是functionA里面的方法不是为它以前的对象而运行了,把functionA的this强行改变成了obj

obj成为functionA中的this,然后来运行functionA这个方法,而arg是传给functionA的参数

function Student(props) {
    this.name = props.name || 'Unnamed';
}

Student.prototype.hello = function () {
    alert('Hello, ' + this.name + '!');
}
function PrimaryStudent(props) {
    Student.call(this, props);
    this.grade = props.grade || 1;
}

比如上面的代码,先定义了Student方法,然后定义了PrimaryStudent方法
PrimaryStudent中, Student.call(this, props);指的是把this——也就是PrimaryStudent对象作为Student运行时的那个this,把props传给Student作为参数,来运行Student这个方法,运行出来的结果是什么呢
PrimaryStudent.name=props.name //这个props是传进来那个props  
然后PrimaryStudent.prototype.hello = function () { alert('Hello, ' + this.name + '!'); } 它还获得了一个写在原型里的方法
PrimaryStudent这个函数运行下来的结果相当于
function PrimaryStudent(props){
this.name = props.name || 'Unnamed';
this.prototype.hello = function () {
    alert('Hello, ' + this.name + '!');
}
}
这就是call方法
它会运行一个函数,然后告诉这个函数你现在得用我给你的对象来运行你的那套方法,返回出什么东西是什么东西


2.原型继承


而原型继承呢
一般我们会先定义一个方法 比如刚才的Student
Student方法里有属性,有定义在原型里的方法
然后我们想继承Student,我们定义出一个新的函数 littleStudent
在这个新的函数内部我们 Student.call(this,arg) 在这里this指的是littleStudent,按上面定义的Student函数(内部拿this写属性和方法),我们会获得一个littleStudent它内部有Student的那些属性和方法
等于Student在我们littleStudent内部执行了一遍,并且是为我们造属性和方法的,我们littleStudent现在也有这些方法了
但这样是继承吗?Student日后有改变,我们的littleStudent会有改变吗,不会
因为我们只是拿call让Student给我们也造了一套属性的方法,我们littleStudent的原型仍然指向littleStudent.protptype
当前的原型链是职业的 new littleStudent() ----> littleStudent.prototype ----> Object.prototype ----> null 跟Student没有关系
需要变成这样 new littleStudent() ----> littleStudent.prototype ----> Student.prototype ----> Object.prototype ----> null

那么怎么继承呢

先创建一个空函数F(){ }
把这个空函数的原型指向Student的原型:F.prototype = Student.prototype;
然后把littleStudent的原型指向F的实例:littleStudent.prototype=new F();; 则littleStudent的原型里包含了student原型里的所有内容
然后把littleStudent原型的构造函数修复为littleStudentlittleStudent.prototype.constructor = littleStudent; 因为之前littleStudent.prototype=new F() 则new F().constructor指向的是构造函数F
然后我们就可以继续在littleStudent对象的原型上添加方法和属性了
littleStudent.prototype.getGrade = function () {
    return this.grade;
};
而这并不会影响Student的原型,因为我们在这儿添加方法相当于是在new F()上添加方法
至此我们又给littleStudent继承了Student的原型,又可以随意给它扩展,这就完成了一次继承









 

转载于:https://www.cnblogs.com/xisitan/p/5142941.html

基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员用户两个主要模块。管理员负责视频、文件文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值