面试题答案
一键面试优化思路
- 原型链优化:将共享的属性和方法定义在原型对象上,而不是在构造函数内部,这样所有实例可以共享这些属性和方法,减少内存占用。
- 闭包与构造函数配合:通过闭包可以实现数据的封装,同时在需要时可以控制对内部数据的访问,并且可以避免在全局作用域中创建过多的变量。
代码示例
- 原型链优化示例
// 定义构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
// 将共享方法定义在原型上
Person.prototype.sayHello = function() {
console.log(`Hello, I'm ${this.name} and I'm ${this.age} years old.`);
};
// 创建实例
const person1 = new Person('Alice', 30);
const person2 = new Person('Bob', 25);
person1.sayHello(); // Hello, I'm Alice and I'm 30 years old.
person2.sayHello(); // Hello, I'm Bob and I'm 25 years old.
在上述代码中,sayHello
方法定义在 Person.prototype
上,所有 Person
实例都可以共享这个方法,而不是每个实例都有自己独立的 sayHello
方法副本,从而减少了内存占用。
- 闭包与构造函数配合示例
function Counter() {
let count = 0;
return {
increment: function() {
count++;
console.log(`Count is now: ${count}`);
},
getCount: function() {
return count;
}
};
}
const counter1 = Counter();
counter1.increment(); // Count is now: 1
counter1.increment(); // Count is now: 2
console.log(counter1.getCount()); // 2
在这个例子中,Counter
函数返回一个包含 increment
和 getCount
方法的对象。count
变量被封闭在闭包中,外部无法直接访问,只能通过返回对象中的方法来操作 count
,实现了数据的封装和保护,同时也避免了在全局作用域创建变量。