JavaScript原型继承机制深度解析
本文深入解析JavaScript基于原型的面向对象机制。通过构造函数创建实例时,属性独立存在;利用prototype属性可实现属性和方法的共享。文章详细阐述了原型链的查找规则、实例属性与原型属性的优先级关系,以及内存释放注意事项。
JavaScript原型继承概述
该语言特性的核心机制基于 JavaScript 独有的原型链(prototype chain)模式。
因此,从严格定义来看,JavaScript 属于基于原型的面向对象语言。这意味着每个实例对象都关联着一个原型,并从中继承属性和方法。
1、构造函数
构造函数与实例创建
借助构造函数可以便捷地创建对象,此时构造函数内部的 this 关键字指向当前正在创建的实例对象:
代码示例如下:
function People(name){
this.name = name;
} 通过 new 运算符配合构造函数来生成实例对象:
代码示例如下:
var people = new People('小明');
console.log(people.name); //输出:小明 然而,若创建多个实例,这些实例之间无法直接共享属性和方法:
代码示例如下:
var people1 = new People('小明');
var people2 = new People('小王');
people1.sex = 'male';
console.log(people2.sex); //输出:undefined 这表明对象在实例化后,其属性和方法各自独立,修改某一实例的属性不会影响其他实例。
2、Prototype
Prototype属性的共享机制
为此引入了 prototype 属性,该属性在生成实例对象时自动创建。它本身是一个对象,包含可在实例间共享的属性和方法。而实例自身的属性和方法则定义在构造函数内。换言之,构造函数内的内容在实例化后成为本地属性,而原型(prototype)中的内容在实例中仅为引用,从而实现多实例共享。
沿用前述构造函数,现为其添加 prototype 属性:
代码示例如下:
People.prototype.sex = 'female';
//亦可写作 People.prototype = {sex: 'female'};
console.log(people1.sex); //输出:male
console.log(people2.sex); //输出:female People 构造函数的 prototype 属性直接影响了 people1 和 people2 两个实例的行为。
原型链查找规则与内存管理
为何 people1.sex 输出 male?这是因为 JavaScript 中的原型关系呈递归形式存在。对象的原型仍是对象,且原型本身也可能拥有原型,其最高层级为全局 Object 对象。
这意味着,一旦 people1.sex 被赋值为 male,原型中对应的值便不再暴露。仅当 people1 自身没有该属性时,才会从构造函数的 prototype 属性中读取,并逐级向上查找,直至 Object 对象。
注:将对象赋值为 “null” 可销毁自定义对象,从而释放内存资源。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
