js中的apply和call,继承(一)

昨天,有朋友问我,apply()和call()的用法,当时就蒙了,记得之前应该遇到过好多次,也用到过,这次,就认真的总结了一点,分享了出来。

apply和call

call

函数名.call(要让this指向的对象, arg1, arg2...argN);
//1. 调用函数
//2. 让函数中的this指向,第一个参数中的对象
//3. 把第二个及以后所有的参数依次传递给函数作为实参!

apply

函数名.apply(要让this指向的对象, 数组或者伪数组);
//1. 调用函数
//2. 让函数中的this指向,第一个参数中的对象
//3. 把第二个参数中的数组或者伪数组拆解开,依次传递给函数作为形参(很常用的特性)

使用注意事项

  1. 当call和apply的第一个参数传入的是一个值类型的数据的时候,这个时候函数中的this会指向值类型对应的引用类型的数据
  2. 当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);
注意
经典继承可以安全的扩展内置对象,但是一定不要随意的修改内置对象

小结

以上见解都是个人总结,如有些地方可能有错误之处,请多多包涵,也欢迎指出。

你可能感兴趣的:(前端开发,继承,javascript,apply,call)