在原型对象上用 object.defineproperty 定义只读共享方法,需将方法挂到构造函数 prototype 上并设 writable: false、configurable: false(enumerable: false 可选);getter 方式天然不可赋值且动态执行,普通函数则必须同时设 writable 和 configurable 为 false 才真正安全。

原型对象上用 Object.defineProperty 定义只读共享方法,核心是把方法挂到构造函数的 prototype 上,并通过描述符控制其不可写、不可配置、不可枚举——这样所有实例都能访问,但谁都改不了它。
定义只读方法的基本写法
直接在原型上设置一个 getter 或普通函数属性,关键设 writable: false 和 configurable: false:
-
writable: false防止实例覆盖赋值(比如inst.method = ...) -
configurable: false阻止后续用defineProperty重新定义或删除该属性 -
enumerable: false(可选)让for...in和Object.keys()看不见它,保持“低调”
用 getter 实现真正只读的计算逻辑
如果方法逻辑依赖实例状态,推荐用 getter —— 它天然不可赋值,且每次访问都动态执行:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
function User(name) {
this.name = name;
}
Object.defineProperty(User.prototype, 'fullName', {
get() {
return `Mr. ${this.name}`;
},
enumerable: false,
configurable: false
});
const u = new User('Alice');
console.log(u.fullName); // "Mr. Alice"
u.fullName = 'Bob'; // 无效(严格模式报错)
挂普通函数时注意 writable 和 configurable 的组合
若挂的是函数引用(非 getter),需确保 writable: false 同时生效,否则实例可能偷偷覆盖:
- ✅ 正确:设
writable: false+configurable: false,连defineProperty都不能再动它 - ⚠️ 危险:只设
writable: false但configurable: true,别人还能用defineProperty把它改成可写的 - ❌ 错误:没设
writable,默认false,但若忘了configurable: false,仍可能被重定义
避免常见陷阱
原型上的方法本身只读,不代表它返回的对象也只读:
- 比如 getter 返回一个普通对象,那个对象内部仍可修改
- 如需深度保护,得配合
Object.freeze或递归冻结返回值 - 想彻底隐藏?可用
Symbol作属性名,或闭包封装,但原型上用 Symbol 会失去继承可见性,慎用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










