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中引入的一种新的函数定义方式,它的语法比传统的函数定义更加简洁。箭头函数没有自己的this
和arguments
,它们通过词法作用域继承上层作用域的this
和arguments
。
箭头函数没有自己的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 使用apply
或call
方法
使用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指向的改变。这些特性的灵活使用可以提高我们的开发效率和代码的质量。