JavaScript构造函数配合prototype实现自定义类的核心是“属性实例化、方法共享化”:this初始化实例独有数据,方法挂载prototype供所有实例共享,节省内存且符合面向对象设计。

JavaScript 中构造函数配合 prototype 实现自定义类与方法,核心在于“属性实例化、方法共享化”——用 this 初始化每个实例独有的数据,把函数定义在 prototype 上,让所有实例共用同一份逻辑,既节省内存,又符合面向对象的设计意图。
构造函数负责定义实例结构
构造函数是创建对象的模板,它决定每个新对象有哪些初始属性。必须首字母大写,并配合 new 使用:
- 在函数体内用
this.属性名 = 值绑定实例专属数据(如姓名、年龄) - 避免在构造函数里直接定义方法(比如
this.say = function(){}),否则每个实例都会复制一份函数,浪费内存 - 若需初始化引用类型(如数组、对象),应在构造函数内新建,防止多个实例意外共享同一份数据
prototype 负责挂载共享方法
prototype 是每个函数自带的对象,所有通过该构造函数创建的实例,都会通过原型链访问它上面的属性和方法:
- 把方法添加到
Person.prototype.sayHello = function(){...},所有new Person()实例都能调用sayHello - 修改
prototype时慎用全量赋值(如Person.prototype = { ... }),这会丢失默认的constructor指向,需手动补上:Person.prototype.constructor = Person - 可借助
Object.getPrototypeOf(obj) === Person.prototype验证原型关系
类型识别与继承基础
有了构造函数和原型,就能自然支持类型判断和简单继承:
- 用
instanceof判断实例归属:p1 instanceof Person返回true - 用
obj.constructor === Person查看对象由哪个构造函数创建(注意:若原型被重写过,需确保constructor已修复) - 实现继承时,子构造函数中用
Parent.call(this, ...)借用父类属性初始化,再用Child.prototype = Object.create(Parent.prototype)链接原型,最后修复Child.prototype.constructor
现代写法兼容性提醒
ES6 的 class 是语法糖,底层仍是构造函数 + 原型机制:
-
class Person { constructor() { } say() { } }编译后等价于函数定义 + 方法挂prototype - 理解
prototype有助于调试、扩展原生对象(如给Array.prototype加工具方法)、阅读老项目或框架源码 - 即便用
class,instanceof和原型链查找逻辑完全一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











