将公共属性添加到父构造函数或父类的 prototype 上,子类实例可通过原型链访问;class 中需显式赋值到 prototype,不可在 class 体内直接声明,否则变为实例属性。

把公共属性加到父构造函数的 prototype 上,子类实例就能通过原型链访问到。
直接挂载到父类 prototype 上
这是最标准、最可靠的方式。只要属性写在父构造函数或父 class 的 prototype 对象里,子类实例(无论用 function + Object.create 还是 class extends)都能继承并访问。
- 函数式写法示例:
function Animal(name) {
this.name = name;
}
Animal.prototype.species = 'unknown'; // 公共属性
Animal.prototype.speak = function() {
return `${this.name} makes a sound`;
};
function Dog(name, breed) {
Animal.call(this, name);
this.breed = breed;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
const dog = new Dog('Leo', 'Golden');
console.log(dog.species); // 'unknown' ✅
console.log(dog.speak()); // 'Leo makes a sound' ✅
class 语法中,不能直接在 class 体里写公共属性
ES6 class 不支持像方法那样直接声明“原型上的公共属性”。下面这种写法是错的:
class Animal {
species = 'unknown'; // ❌ 这是实例字段,每个实例都有一份
speak() { return `${this.name}...`; } // ✅ 方法自动上原型
}
正确做法是显式赋值到原型:
Animal.prototype.species = 'unknown';- 或在 class 定义后、实例化前统一设置
验证属性是否真在原型链上
确保它没被意外写进实例自身,而是可被继承的关键步骤:
-
dog.hasOwnProperty('species')→ 应返回false -
Object.getPrototypeOf(dog) === Dog.prototype→true -
Dog.prototype.hasOwnProperty('species')→false?不,如果手动加了就是true;但更稳妥看'species' in Dog.prototype -
'species' in dog→true(因为原型链能查到)
避免常见陷阱
以下方式会导致属性无法被子类实例“自然继承”:
- 在父类 constructor 里用
this.species = ...→ 属于实例私有,子类实例有但不共享,且无法被覆盖或统一修改 - 用
static species = ...→ 属于类本身,实例不可访问(dog.species是undefined) - 在子类 prototype 上重复定义同名属性 → 会遮蔽父类的,除非有意覆盖


















