在JavaScript中,构造函数是一种特殊的函数,用于初始化对象。当使用new关键字调用构造函数时,它会创建一个新的对象实例,并将构造函数内部的this关键字绑定到这个新对象上。构造函数通常用于定义对象的属性和方法,以及创建对象的实例。
1. 构造函数的定义和调用
- 构造函数通常以大写字母开头,以便与普通函数区分。
- 它们可以包含属性和方法,这些属性和方法通过this关键字添加到新创建的对象上。
- 调用构造函数时,需要使用new关键字,这样可以确保this正确地指向新创建的对象实例。
- 构造函数内部无需写return,返回值即为新创建的对象。
function Person(name, age) {
this.name = name;
this.age = age;
}
var person1 = new Person('Alice', 25);
2. 实例成员&静态成员
- 实例成员:通过构造函数创建的对象称为实例对象,实例对象中的属性和方法称为实例成员。
- 静态成员:构造函数的属性和方法被称为静态成员
function Person(name, age) {
this.name = name; // 实例成员
this.age = age; // 实例成员
}
// 静态成员
Person.species = 'Homo sapiens';
// 注意:
// 1.name和age是每个通过Person构造函数创建的对象实例所独有的实例成员。
// 2.species是Person构造函数本身的静态成员,它与任何特定的Person实例无关。
当创建Person的实例时,可以像下面这样访问实例成员:
var alice = new Person('Alice', 30);
console.log(alice.name); // 输出: Alice
console.log(alice.age); // 输出: 30
而静态成员可以通过构造函数本身来访问:
console.log(Person.species); // 输出: Homo sapiens
3. 内置构造函数
JavaScript内置构造函数是语言提供的一组预先定义的函数,用于创建和管理不同类型的对象。这些构造函数不仅提供了创建对象的快捷方式,还定义了对象的默认行为和属性。内置构造函数包括但不限于Object、Array、String、Number、Boolean、Date、RegExp等。
4. 内置构造函数的常用方法
4.1 Object构造函数
- Object.keys(obj):静态方法获取对象中所有属性。
- Object.values(obj):静态方法获取对象中所有属性值。
- Object.assign(target, ...sources): 静态方法创建新的对象。
const obj = { name: 'Alice', age: 30 };
console.log(Object.keys(obj)); // ["name", "age"]
console.log(Object.values(obj)); // ["Alice", 30]
const newObj = Object.assign({}, obj, { city: 'New York' });
console.log(newObj); // { name: 'Alice', age: 30, city: 'New York' }
4.2 Array构造函数
- forEach(): 迭代数组中的每个元素。
let nums = [1, 2, 3];
nums.forEach(function(item, index, arr) {
console.log(item * 2); // 分别输出 2, 4, 6
});
- filter(): 创建过滤后的新数组
let nums = [1, 2, 3, 4, 5];
let evens = nums.filter(num => num % 2 === 0);
console.log(evens); // 输出 [2, 4]
- map(): 创建映射后的新数组
let doubles = [1, 2, 3].map(x => x * 2);
console.log(doubles); // 输出 [2, 4, 6]
- join(): 将数组转换为字符串
let words = ['Hello', 'world'];
let str = words.join(' ');
console.log(str); // 输出 "Hello world"
- find(): 找到第一个匹配的元素
let array = [1, 2, 3, 4, 5];
let found = array.find(element => element > 3);
console.log(found); // 输出 4
- every(): 检查所有元素是否符合条件
let bool = [2, 4, 6].every(n => n % 2 === 0);
console.log(bool); // 输出 true
- some(): 是否存在至少一个元素符合条件
bool = [2, 4, 6, 7].some(n => n % 2 !== 0);
console.log(bool); // 输出 true
- concat(): 合并多个数组
let array1 = [1, 2];
let array2 = [3, 4];
let combined = array1.concat(array2);
console.log(combined); // 输出 [1, 2, 3, 4]
- sort(): 对数组排序
let arr = [3, 1, 4, 1, 5, 9];
arr.sort();
console.log(arr); // 输出 [1, 1, 3, 4, 5, 9]
- splice(): 修改数组
let list = ['a', 'b', 'c', 'd'];
list.splice(1, 2, 'x'); // 删除从第1索引开始的2个元素,插入'x'
console.log(list); // 输出 ['a', 'x', 'd']
- reverse(): 反转数组顺序
let reversed = ['one', 'two', 'three'].reverse();
console.log(reversed); // 输出 ['three', 'two', 'one']
- findIndex(): 查找符合条件元素的索引
let index = [1, 2, 3, 4].findIndex(value => value > 2);
console.log(index); // 输出 2
4.3 String构造函数
- length:用来获取字符串的度长。
- split:('分隔符') 用来将字符串拆分成数组。
- substring:(需要截取的第一个字符的索引[,结束的索引号]) 用于字符串截取。
- startsWith:(检测字符串[, 检测位置索引号]) 检测是否以某字符开头。
- includes:(搜索的字符串[, 检测位置索引号]) 判断一个字符串是否包含在另一个字符串中,根据情况返回 true 或 false。
- toUpperCase:用于将字母转换成大写。
- toLowerCase:用于将就转换成小写。
- indexOf:检测是否包含某字符。
- endsWith:检测是否以某字符结尾。
- replace:用于替换字符串,支持正则匹配。
- match:用于查找字符串,支持正则匹配。
const text = 'Hello, World!';
console.log(text.length); // 13 注意逗号后面有空格
console.log(text.split(' ')); // ["Hello", ",", "World", "!"]
console.log(text.substring(7, 12)); // "World"
console.log(text.startsWith('Hello')); // true
console.log(text.includes('World')); // true
4.4 Number构造函数
- toFixed:用于设置保留小数位的长度。
const number = 123.456;
console.log(number.toFixed(2)); // "123.46"