网上大牛,说的很直接,劫持另外一个对象(a)的方法,继承a的属性., 我个人理解,就是把你的变成我的.
1.对象的继承,一般的做法是复制:Object.extend
下面是prototype.js的实现方式是:传入两个对象,把source里的属性,放到destination里,很直白
Object.extend = function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; }
2.Function.apply(obj, args)的实现
当然还有要说的apply()方法,就是:
Function.apply(obj,args)方法,需要接收两个参数.
- obj: 这个对象将代替Function类里this对象
- args: 这个是数组,它将作为参数传给Function(args-->arguments)
下面测试使用apply方法,实现学生对象,拥有'人'对象的吃的功能以及写的功能.
有一个我总用的在线测试js的工具, 直接在上面测试就行,https://jsrun.net/new
function Person(name,age){//定一个人的对象,有名字,年龄 this.name = name; this.age = age; //还有吃的功能 this.eat=function(){ console.log('吃'); } } function Write(){//写字的类 this.funcName = "Write"; this.show = function(){ let msg = []; for(let key in this){ if(typeof(this[key]) != "function"){ msg.push([key, ":", this[key]].join("")); } } console.log(msg.join(" ")); } } function Student(name,age,grade,school){ //学生类 Person.apply(this,arguments); Write.apply(this,arguments); this.grade=grade; //年级 this.school=school; //学校 } let p1 = new Person('Mark',23); p1.eat(); let s1 = new Student('Jhon',23,3,"铁路大学"); s1.show(); s1.eat();
结果展示:
> "吃" > "name:Jhon age:23 funcName:Write grade:3 school:铁路大学" > "吃"
结论: 学生类本来不具备任何方法,但是在Person.apply(this,arguments)后,他就具备了Person类的eat()方法和所有属性。apply方法劫持另外一个对象的方法,继承另外一个对象的属性
2.apply()的应用
Function.apply()在提升程序性能方面的技巧
我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值。
比如
alert(Math.max(5,8)) //8
alert(Math.max(5,7,9,3,1,6)) //9
但是在很多情况下,我们需要找出数组中最大的元素。
例如:
let arr = [1,2,0,4]; //max方法不支持数组格式,需要遍历 const getMax1 = function(arr){ var back = ''; for(var i = 0,back = arr[0]; i < arr.length; i++){ back = Math.max(arr[i],back); } return back; } console.log(getMax1(arr));
上述,我们需要得到数组中最大的元素,需要遍历,在调用max方法找到最大方法,如果使用apply()方法,可以很简洁的获取最大值
//使用apply之后, const getMax = function(arr){ return Math.max.apply(null,arr); } console.log(getMax(arr));
两段代码可以看出,使用apply(),代码简洁,高效。根据自己实际情况,灵活使用apply()方法.
标签:function,arr,记录,max,学习,apply,方法,Math From: https://www.cnblogs.com/Young111/p/16914811.html