返回

JavaScript 原型初探:10 分钟掌握原型精髓

前端

JavaScript 原型:一文速解,提升你的编程技能

什么是原型?

想象一下,原型就像一个蓝图,它定义了对象的结构和行为。每个对象都有一个原型,而这个原型本身也是一个对象,包含着对象可以继承的属性和方法。

通过访问 __proto__ 属性,我们可以查看一个对象的原型。就像这样:

const obj = {};
console.log(obj.__proto__); // {} (Object.prototype)

结果显示,obj 的原型是一个空对象,因为它是直接通过 Object 构造函数创建的,而 Object 构造函数的原型就是一个空对象。

原型继承

JavaScript 中,对象通过原型实现继承。当创建一个对象时,它会自动继承其原型的属性和方法。举个例子:

const person = {
  name: "张三",
  age: 20,
};

const student = Object.create(person);
console.log(student.name); // 张三
console.log(student.age); // 20

在这个例子中,student 对象是通过 Object.create() 方法创建的,它的原型是 person 对象,因此它继承了 person 对象的属性和方法。

原型链

每个 JavaScript 对象都有一个原型链,它是一个指向其原型的链条,允许对象访问其原型及其原型的属性和方法。比如:

const obj = {};
console.log(obj.__proto__.__proto__); // {} (Object.prototype)
console.log(obj.__proto__.__proto__.__proto__); // null

在这个例子中,obj 的原型链为:obj -> Object.prototype -> null

原型方法和原型属性

原型对象可以包含属性和方法,这些属性和方法可以被对象继承。

原型方法是定义在原型对象上的方法,它可以被对象继承和使用。比如:

const person = {
  name: "张三",
  age: 20,
  sayHello() {
    console.log("Hello, my name is " + this.name);
  },
};

const student = Object.create(person);
student.sayHello(); // Hello, my name is 张三

在这个例子中,person 对象的 sayHello() 方法是一个原型方法,它被 student 对象继承并使用。

原型属性是定义在原型对象上的属性,它可以被对象继承和使用。比如:

const person = {
  name: "张三",
  age: 20,
};

const student = Object.create(person);
console.log(student.name); // 张三
console.log(student.age); // 20

在这个例子中,person 对象的 nameage 属性是原型属性,它们被 student 对象继承和使用。

构造函数

构造函数是创建对象的函数,它可以指定对象的原型。比如:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

const person = new Person("张三", 20);
console.log(person.name); // 张三
console.log(person.age); // 20

在这个例子中,Person 函数是一个构造函数,它创建了一个新的 person 对象,并指定了这个对象的原型。

结论

掌握了 JavaScript 原型,你就可以更深入地理解面向对象编程的概念,并编写出更优雅、更易维护的代码。

常见问题解答

  • 原型和实例有什么区别?

原型是对象的模板,而实例是基于原型创建的具体对象。

  • 如何访问对象的原型?

可以通过 __proto__ 属性访问对象的原型。

  • 原型链的作用是什么?

原型链允许对象访问其原型及其原型的属性和方法。

  • 如何修改原型?

可以通过 Object.defineProperty() 方法修改原型。

  • 什么时候应该使用原型?

当需要实现对象继承或代码复用时,应该使用原型。