JavaScript是一种高级的、解释执行的编程语言,其内置了面向对象的特性,使得开发者可以利用对象、继承等概念进行编程。在JavaScript中,对象可以看作是属性的无序集合,属性可以是基本值、对象或者函数。每个属性或方法都有一个键(Key),每个键名映射到一个值(Value)。JavaScript中的对象创建和继承是面向对象程序设计的重要组成部分,提供了多种方式来创建对象和实现继承。
对象概述部分介绍了对象是包含零个或多个属性的集合。这些属性可以是基本类型的值,也可以是其他对象或函数。JavaScript对象的属性分为数据属性和访问器属性两种:
1. 数据属性由以下特性组成:[[Writable]](可写)、[[Value]](值)、[[Enumerable]](可枚举)、[[Configurable]](可配置)。
2. 访问器属性由以下特性组成:[[Get]](获取属性值的函数)、[[Set]](设置属性值的函数)、[[Enumerable]]、[[Configurable]]。
在JavaScript中,对象的创建可以通过多种方式实现:
1. 对象字面量:最简单和最常见的创建对象的方式。它允许你直接在大括号中定义一个对象,包括它的属性和方法。
2. 构造函数:使用new运算符和构造函数来创建对象。构造函数用于初始化新创建的对象,并且可以利用prototype属性共享方法。
3. Object.create():这个方法用于创建一个新对象,使用第一个参数作为新对象的原型。
4. ES6中的class:在ES6中引入了class关键字,它提供了一种更接近传统面向对象语言的写法。尽管class看起来像传统的类,但实际上JavaScript的class仍然基于原型。在class中定义的方法实际上挂载到原型上,而静态属性则挂载到构造函数本身上。class中定义的方法默认是不可枚举的。
JavaScript中的继承是指一个对象拥有另一个对象的属性和方法。继承的实现方式主要有两种:
1. prototype属性:通过原型链实现继承。每个对象都有一个内部链接指向另一个对象,这个对象称为原型。原型包含可以被该对象共享的属性和方法。所有通过同一个构造函数创建的对象都会共享相同的原型对象。
2. ES6中的extends关键字:在ES6中引入的extends关键字允许开发者使用更简洁的语法来实现类的继承。然而,这本质上仍然是原型链的工作方式,只是看起来更直观和简洁。
在JavaScript面向对象的程序设计中,使用new运算符从构造函数生成实例对象时,每个实例都会有自己的属性和方法副本,这虽然实现了封装,但也导致了内存的浪费,因为无法共享属性和方法。通过引入prototype属性,可以将需要共享的属性和方法放在原型对象中,而实例对象则可以共享这些属性和方法,从而提高了内存的使用效率。