当类中同时存在同名的公有字段(如 `method = "sss"`)和子类方法(如 `method() {}`)时,实例优先访问的是**自身拥有的字段属性**,而非原型链上的同名方法,这是由属性设置时机、位置(own property vs. prototype)及 javascript 原型机制共同决定的。
在 JavaScript 类中,method = "sss" 和 method() {} 表面相似,实则语义与运行机制截然不同:
class Parent {
method = "sss"; // 等价于在 constructor 中执行 this.method = "sss"
}class Parent {
method() { console.log("Parent"); }
}
// 等价于:
Parent.prototype.method = function() { console.log("Parent"); };class Parent {
method = "sss";
parentMethod() { console.log("Parent method"); }
}
class Child extends Parent {
method() { console.log("Child method"); }
childMethod() { console.log("Child method"); }
}
const child = new Child();
console.log(child.method); // → "sss" (自有字段,优先命中)
console.log(child.hasOwnProperty("method")); // → true
console.log(typeof child.method); // → "string"
// 但方法依然存在于原型链中,可显式调用:
child.parentMethod(); // → "Parent method"
child.childMethod(); // → "Child method"
// 注意:child.method() 会报错!因为 "sss" 是字符串,不可调用
// TypeError: child.method is not a function
简言之:字段赢在“实例优先”,方法赢在“原型共享”;同名时,自有属性永远胜出。理解这一机制,是写出可维护、可预期的 JavaScript 类的关键基础。