网上大牛,说的很直接,劫持另外一个对象(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()方法.