昨天,有朋友问我,apply()和call()的用法,当时就蒙了,记得之前应该遇到过好多次,也用到过,这次,就认真的总结了一点,分享了出来。
apply和call
call
函数名.call(要让this指向的对象, arg1, arg2...argN);
//1. 调用函数
//2. 让函数中的this指向,第一个参数中的对象
//3. 把第二个及以后所有的参数依次传递给函数作为实参!
apply
函数名.apply(要让this指向的对象, 数组或者伪数组);
//1. 调用函数
//2. 让函数中的this指向,第一个参数中的对象
//3. 把第二个参数中的数组或者伪数组拆解开,依次传递给函数作为形参(很常用的特性)
使用注意事项
- 当call和apply的第一个参数传入的是一个值类型的数据的时候,这个时候函数中的this会指向值类型对应的引用类型的数据
- 当call和apply的第一个参数传入的是undefined或者null或者不传的时候,函数中的this指向window对象
实例
function Person(){
this.name = "";
this.age = "";
this.gender = "";
}
function Student(){
Person.call(this);
}
//创建好的t对象就拥有了name age 和gender
var t = new Student();
//分析: Person.call(this);
//this:在创建对象在这个时候代表的是student
//也就是通俗一点讲就是:用Student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面
js中的继承
在js中本身是没有继承的这个概念的,这个概念也是根据需求我们借用其他语言演化而来了,实现js的继承的方法有很多,这里我就只简单的说几种,后续再添加。
混入式继承
混入式继承就是通过for-in循环,将一个对象中的所有属性和方法,全部混入到另外一个对象中,以实现继承,下面实例更好的说明
var obj = {};
var obj1 = {
name: "",
age: 18,
gender: "male"
};
for(var k in obj1){
obj[k] = obj1[k];
}
原型继承
原型继承一般都是我们做开发的常用的一种方法,在原型继承中我简单的介绍两种方式
原型替换
这个方法比较简单,就是直接把原型
//定义了一个Animal类
function Animal(){
this.color = "white";
this.name = "小甜甜";
this.age = 4;
this.gender = "female";
}
var ani = new Animal();
//定义了一个dog类
function Dog(){
}
//把dog的原型指向了Animal的实例对象
Dog.prototype = ani;
var d = new Dog();
console.log(d.name);
console.log(d.gender);
混合式继承
混合式继承,利用混入的方法给原型添加属性和方法,具体用法如下
//让所有通过method创建出来的对象,都继承自obj
function extend(method, obj) {
for(var k in obj){
method.prototype[k] = obj[k];
}
}
Teacher.extend = function(obj) {
for(var k in obj){
this.prototype[k] = obj[k];
}
}
Teacher.extend({money: 999999999});
var t1 = new Teacher();
console.log(t1.money);
经典继承
经典继承主要是用到了Object.create()方法,关于这个方法,在网上已经有了很多的介绍,我这里就不再说明了
var obj1 = {
name: "你不知道的",
age: 18,
gender: "male"
};
//创建一个新对象obj,obj的原型就是obj1,实现了obj继承自obj1
var obj = Object.create(obj1);
//其实Object.create方法的内部实现,就是将obj1作为了obj的原型!
console.log(obj.name);
console.log(obj.__proto__ === obj1);
注意
经典继承可以安全的扩展内置对象,但是一定不要随意的修改内置对象
小结
以上见解都是个人总结,如有些地方可能有错误之处,请多多包涵,也欢迎指出。