js的继承方法小结(prototype、call、apply)(推荐)
js的原型继承 -- prototype
先说下什么是prorotype?
- js中,俗话说“一切皆对象”。用new 出来的都是函数对象;否则就是普通对象
- 函数对象都有prototype(原型对象);而普通对象则只有__proto__(原型指针)
- 函数对象的一个特点可以实现不同类之间的方法继承
- 函数的子类可以共享父类的方法,而父类不能想用子类的方法
eg: (prototype的继承) //创建父类函数对象 function Personal(name, age) { this.name = name; //父类的私有属性 this.age = age; this.house = ['北京', '上海'] } Personal.prototype.run = function() { //给父类原型动态添加方法 alert('原型方法' + this.name + ' is running!'); } var per = new Personal('小白', 24) per.run() //打印 --> 原型方法小白 is running! //创建子类函数对象 function Boy() {} Boy.prototype = new Personal('小黑', 19) //子类继承父类的所有属性和方法 Boy.prototype.source = 100 //给子类添加原型属性 Boy.prototype.printSource = function() { //给子类添加方法 alert(this.name + '的原型方法printSouce打印成绩为' + this.source) //小黑的原型方法printSouce打印成绩为100 } Boy.prototype.run() //打印 --> 原型方法小黑 is running! var boys = new Boy() boys.printSource() console.log(boys, '--boys---') //打印 -->19, 小黑, 100 (这里会沿着prototype向上查找到Personal的属性)
以下是关于prototype继承需要注意的点
1.如果父类中有引用类型的属性Array,Object等。子类继承了这些属性,并尝试改变的话,会影响到父类的属性。
//创建一个实例1 var boys1 = new Boy() boys1.house.push('深圳') //打印这两个实例 console.log(boys, boys1)
可以看出来,当属性为引用类型时,只要有一个实例的属性做了操作,所有的实例都会受到影响。
2.该方式导致 Boy.prototype.constructor 被重写,它指向的是 Personal 而非 Boy。你需要手动将 Boy.prototype.constructor 指回 Boy。
Boy.prototype = new Personal(); Boy.prototype.constructor === Personal; // true // 重写 Boy.prototype 中的 constructor 属性,指向自己的构造函数 Boy Boy.prototype.constructor = Boy;
3.因为 Boy.prototype = new Personal(); 重写了 Boy 的原型对象,所以 printSource 放在重写原型对象之前会被覆盖掉,给子类添加原型方法必须在替换原型之后(eg是没有被覆盖的)。
function Boy() {} Boy.prototype = new Personal(); // 给子类添加原型方法必须在替换原型之后 Boy.prototype.printSource = function() { console.log('printSource~'); };
4.创建 boys 实例时无法向父类的构造函数传参,也就是无法初始化 source属性。只能创建实例之后再修改父类的属性。
const boys = new Boy(); // 只能创建实例之后再修改父类的属性 boys.source = 100;
apply()、call()方法的继承
了解下apply()、call()方法
1.apply()、call()的用法
obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1, arg2, ...]);
obj是父级,thisObj是子级;第二个参数apply可以接收一个数组,而call只能是每项逐个接收。
2.apply和call 本来就是为了扩展函数的作用域而生的,换句话说就是为了改变this的指向存在的。
3.当一个object没有某种方法,其他的有,我们可以借助call和apply来用其他对象的方法来做操作,也可以传参数。
//eg: function Personal(name, sex) { this.name = name; this.sex = sex; this.say = function (){ alert('姓名' + this.name + ';性别' + this.sex) } } const per = new Personal('Allan', '男') per.say(); //apply()方法实现 function Girls(name, sex) { Personal.apply(this, [name, sex]); //Person.apply(this,arguments); //跟上句一样的效果,arguments //Print.apply(this,arguments); //还可以实现继承多个父类,原型 prototype只能继承一个父类!!!切记 } const girls1 = new Girls('Lucy', '女') girls1.say(); //call()实现 function Boy(name, sex) { Personal.call(this, name, sex); } const boys = new Boy('Barry', '男'); boys.say() //
- prototype可以动态的给对象增加属性和方法。
- 可以实现子类继承父类,拥有父类的属性和方法。
- call和apply的区别,在于参数的不同。
- call和apply,理解为在子类的运行环境中执行父类的方法和属性。
- call和apply可以实现一个子类继承多个父类,prototype只能有一个父类。
以上所述是长沙网络推广给大家介绍的js的继承方法小结详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,长沙网络推广会及时回复大家的。在此也非常感谢大家对狼蚁SEO网站的支持!
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南