JavaScript 中的面向对象编程(OOP)主要通过原型链(prototype chain)来实现。每个 JavaScript 对象都有一个内部属性 [[Prototype]]
,它指向另一个对象,即该对象的原型。当我们试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或方法,或者到达原型链的末端(即 null
)。
prototype
属性,这个属性指向一个对象,这个对象就是原型对象。new
关键字调用构造函数创建的对象。// 定义一个构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
// 在原型上添加方法
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};
// 创建实例
const alice = new Person('Alice', 30);
alice.greet(); // 输出: Hello, my name is Alice and I am 30 years old.
// 检查原型链
console.log(alice.__proto__ === Person.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__ === null); // true
Person
示例。原因:当原型链过长时,查找属性或方法的时间会增加。
解决方法:
Object.create()
创建对象,明确指定原型。原因:不小心修改了原型对象,导致所有实例受到影响。
解决方法:
Object.freeze()
冻结原型对象,防止被修改。const safePrototype = Object.freeze({
greet: function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
});
function SafePerson(name, age) {
this.name = name;
this.age = age;
}
SafePerson.prototype = safePrototype;
const bob = new SafePerson('Bob', 25);
bob.greet(); // 输出: Hello, my name is Bob and I am 25 years old.
通过这种方式,可以有效防止原型对象被意外修改。
领取专属 10元无门槛券
手把手带您无忧上云