js对原型和继承的理解

简介: 了解JavaScript中原型和继承的概念对于编写优雅高效的代码、理解库和框架的内部机制以及执行高级设计模式都有着重要的意义。

在JavaScript中,原型(Prototype)和继承是实现对象间共享特性和行为的两个核心概念。理解原型和继承对于编写高效和可维护的代码至关重要。

原型(Prototype)

原型是一个基础概念,JavaScript中每个对象都有一个原型对象,而从原型对象可以继承方法和属性。原型对象本身也是一个普通的对象,但其用途主要是作为一个共享的模板,其他对象可以利用它作为一个引用模板来获取共享的属性或方法。

在JavaScript中,所有通过对象字面量创建的对象都隐式地有一个 Object.prototype作为它们的原型。这就意味着它们可以访问 Object.prototype上定义的所有方法,如 toString()hasOwnProperty()

let myObject = {
    name: 'JavaScript'
};
console.log(myObject.hasOwnProperty('name')); // 输出: true

构造函数和原型属性

JavaScript通过构造函数模式来创建一个类似与“类”的结构,构造函数用于创建特定类型的对象。每个构造函数都有一个原型对象,它的所有实例将从这个原型对象继承属性和方法。

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

Person.prototype.sayHello = function() {
    console.log('Hello, my name is ' + this.name);
};

let person1 = new Person('Alice');
person1.sayHello(); // 输出: Hello, my name is Alice

在这个例子中,Person的所有实例都可以访问 sayHello方法,因为 sayHello方法被定义在 Person.prototype上。

继承

继承在JavaScript中通常是通过原型链来实现的。原型链是对象和原型之间的链接,一个对象的属性或方法可以沿着原型链向上查找,直到找到为止。

function Programmer(name, language) {
    Person.call(this, name);
    this.language = language;
}

Programmer.prototype = Object.create(Person.prototype);
Programmer.prototype.constructor = Programmer;

Programmer.prototype.code = function() {
    console.log('I am coding in ' + this.language);
};

let programmer1 = new Programmer('Bob', 'JavaScript');
programmer1.sayHello(); // 输出: Hello, my name is Bob
programmer1.code(); // 输出: I am coding in JavaScript

在上述代码中,Programmer继承了 Person。我们设置 Programmer.prototypePerson.prototype的一个实例,创建了一个原型链。现在,Programmer的实例就可以访问在 Person原型上定义的 sayHello方法了,同时 Programmer也定义了自己的 code方法。

ES6引入的类语法让继承变得更加清晰和易于理解,但在底层,这依然是使用原型链来实现的。

class Person {
    constructor(name) {
        this.name = name;
    }
    sayHello() {
        console.log(`Hello, my name is ${this.name}`);
    }
}

class Programmer extends Person {
    constructor(name, language) {
        super(name);
        this.language = language;
    }
    code() {
        console.log(`I am coding in ${this.language}`);
    }
}

let programmer1 = new Programmer('Eve', 'Python');
programmer1.sayHello(); // 输出: Hello, my name is Eve
programmer1.code(); // 输出: I am coding in Python

在使用class关键词时,继承通过 extends关键词指定,super()函数用于调用父类的构造函数。尽管语法更接近传统面向对象编程语言,但其背后原理仍然是基于JavaScript中的原型和原型链的。

了解JavaScript中原型和继承的概念对于编写优雅高效的代码、理解库和框架的内部机制以及执行高级设计模式都有着重要的意义。

目录
相关文章
|
2月前
|
JavaScript 前端开发
如何在JavaScript中实现基于原型的继承机制
【8月更文挑战第14天】如何在JavaScript中实现基于原型的继承机制
29 0
|
29天前
|
自然语言处理 JavaScript 前端开发
一文梳理JavaScript中常见的七大继承方案
该文章系统地概述了JavaScript中七种常见的继承模式,包括原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合继承等,并探讨了每种模式的实现方式及其优缺点。
一文梳理JavaScript中常见的七大继承方案
|
1月前
|
JavaScript 前端开发
js之class继承|27
js之class继承|27
|
1月前
|
JSON JavaScript 前端开发
js原型继承|26
js原型继承|26
|
1月前
|
JavaScript 前端开发 开发者
JavaScript 类继承
JavaScript 类继承
17 1
|
27天前
|
JavaScript 前端开发
JavaScript prototype(原型对象)
JavaScript prototype(原型对象)
26 0
|
1月前
|
JavaScript 前端开发
JavaScript基础知识-原型(prototype)
关于JavaScript基础知识中原型(prototype)概念的介绍。
32 1
|
1月前
|
JavaScript 前端开发
JS的几种继承方式
JavaScript中的几种继承方式视频。
12 0
|
2月前
|
JavaScript 前端开发
JavaScript中什么是原型?有什么用?
JavaScript中什么是原型?有什么用?
19 1
|
2月前
|
JavaScript 前端开发 Java
什么是JavaScript原型对象
【8月更文挑战第2天】什么是JavaScript原型对象
56 9