JavaScript进阶学习之初识类、函数进阶、如何改变this指向

1. 初识类

JavaScript是一门面向对象的编程语言,面向对象的核心是类和实例。ES6引入了class(类)关键字,使得JavaScript的面向对象编程更加易于理解和使用。

class是一种定义对象的模板,它定义了一组属性和方法,可以看作是对象的一个蓝图。通过class关键字可以定义类,并且可以使用new关键字来实例化一个对象。下面是一个简单的类的定义和使用示例:

class Person {

constructor(name, age) {

this.name = name;

this.age = age;

}

sayHello() {

console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);

}

}

let person = new Person('Tom', 18);

person.sayHello(); // 输出:Hello, my name is Tom, I'm 18 years old.

1.1 类的继承

ES6中引入了class的继承,支持在一个类的基础上,定义另一个类。继承使用extends关键字。下面是一个简单的类继承的示例:

class Animal {

constructor(name) {

this.name = name;

}

eat() {

console.log(`${this.name} is eating.`);

}

}

class Dog extends Animal {

bark() {

console.log(`${this.name} is barking.`);

}

}

let dog = new Dog('旺财');

dog.eat(); // 输出:旺财 is eating.

dog.bark(); // 输出:旺财 is barking.

2. 函数进阶

函数是JavaScript中的一等公民,函数也是面向对象编程的核心。JavaScript中函数可以看作是对象,可以作为参数传递,也可以作为返回值返回。ES6中引入了一些新的语法和特性,让函数的使用更加灵活和方便。

2.1 箭头函数

箭头函数是ES6中引入的一种新的函数定义方式,它的语法比传统的函数定义更加简洁。箭头函数没有自己的thisarguments,它们通过词法作用域继承上层作用域的thisarguments

箭头函数没有自己的this,它们的this是词法作用域中的this,也就是在定义时确定了。下面是一个箭头函数的使用示例:

let a = () => { console.log(this); }

a(); // 输出全局对象

2.2 默认参数值

在ES6之前,我们需要手动判断参数是否有值,并使用默认值来进行赋值。在ES6中,我们可以为参数设置默认值,如果传递了参数,则使用传递的值,如果没有传递,则使用默认值。下面是一个默认参数值的使用示例:

function add(x, y = 1) {

return x + y;

}

console.log(add(1)); // 输出:2

console.log(add(1, 2)); // 输出:3

3. 如何改变this指向

this是JavaScript中非常重要的一个概念,它指向当前函数执行时所在的上下文对象,不同的调用方式会导致this指向不同,这是JavaScript中的一个常见问题。在开发中,我们经常需要手动改变this的指向。

3.1 使用bind方法

可以使用Function.prototype.bind方法来手动改变this的指向。bind()方法创建一个新的函数,并设置this关键字和传递给bind()方法的一组参数。下面是bind()的使用示例:

let obj = {

name: 'Tom',

sayName: function() {

console.log(`My name is ${this.name}.`);

}

}

let obj2 = {

name: 'Jerry'

};

obj.sayName.bind(obj2)(); // 输出:My name is Jerry.

3.2 使用applycall方法

使用Function.prototype.bind方法只能在函数调用时改变this的指向,使用apply()call()方法可以在调用函数时改变this的指向。

apply()call()的区别在于传递参数的方式不同。使用apply()方法时,可以传递一个包含多个参数的数组,而使用call()方法则需要一个一个传递参数。下面是使用apply()call()方法的使用示例:

let obj = {

name: 'Tom',

sayName: function() {

console.log(`My name is ${this.name}.`);

}

}

let obj2 = {

name: 'Jerry'

};

obj.sayName.apply(obj2); // 输出:My name is Jerry.

obj.sayName.call(obj2); // 输出:My name is Jerry.

3.3 使用箭头函数

在箭头函数中,this的指向是在定义函数时确定的,因此在箭头函数中this的指向不会改变。下面是箭头函数的使用示例:

let obj = {

name: 'Tom',

sayName: () => {

console.log(`My name is ${this.name}.`);

}

}

let obj2 = {

name: 'Jerry'

};

obj.sayName(); // 输出:My name is undefined.

obj.sayName.call(obj2); // 输出:My name is undefined.

总结

本文主要介绍了JavaScript中的类、函数进阶和如何改变this指向。在开发过程中,我们需要根据实际情况使用不同的方式来实现代码的复用和this指向的改变。这些特性的灵活使用可以提高我们的开发效率和代码的质量。