2025年09月04日/ 浏览 7
在 JavaScript 中,每个函数都有一个特殊的 prototype
属性,这个属性指向一个对象——我们称之为原型对象。当通过 new
操作符创建实例时,实例内部会包含一个指向构造函数的原型对象的 __proto__
链接。这种机制形成了 JavaScript 特有的原型链。
javascript
function Article() {
this.title = ‘默认标题’;
this.keywords = [‘技术’, ‘分享’];
}
// 在原型上添加共享方法
Article.prototype.generateContent = function() {
return ${this.title}\n关键词: ${this.keywords.join(',')}
;
};
const techArticle = new Article();
console.log(techArticle.generateContent()); // 调用共享方法
假设我们需要构建一个文章生成系统,所有文章实例都应具备标准的内容生成方法,但各自维护不同的元数据:
javascript
function ContentGenerator(title, keywords) {
this.title = title || ‘未命名文章’;
this.keywords = keywords || [];
this.wordCount = 1000;
}
// 共享方法定义
ContentGenerator.prototype = {
constructor: ContentGenerator,
formatMeta() {
return 标题: ${this.title}\n关键词: ${this.keywords.slice(0,3).join(' ')}
;
},
generateBody() {
const baseContent = 本文围绕"${this.title}"展开讨论,
;
return baseContent + ‘在此处添加详细内容…’.repeat(20).substring(0, this.wordCount);
}
};
// 实例化使用
const travelArticle = new ContentGenerator(‘旅行见闻’, [‘游记’, ‘摄影’, ‘自由行’]);
console.log(travelArticle.formatMeta());
相比在每个实例中直接定义方法,原型共享可以显著减少内存占用。当创建数千个实例时,方法只在内存中存在一份,而不是每个实例都携带方法副本。
JavaScript 允许运行时动态修改原型,这为功能扩展提供了灵活性:
javascript
// 后续添加新方法
ContentGenerator.prototype.wordCountCheck = function() {
return this.wordCount >= 800 ? ‘达标’ : ‘未达标’;
};
// 所有实例立即获得新方法
console.log(travelArticle.wordCountCheck()); // 输出”达标”
通过原型链可以实现类似传统面向对象语言的继承:
javascript
function SeoArticle(seoKeywords) {
ContentGenerator.call(this);
this.seoKeywords = seoKeywords;
}
// 建立原型链
SeoArticle.prototype = Object.create(ContentGenerator.prototype);
SeoArticle.prototype.constructor = SeoArticle;
// 添加子类特有方法
SeoArticle.prototype.analyzeKeywords = function() {
return this.seoKeywords.concat(this.keywords).join(‘ | ‘);
};
直接修改内置对象原型是危险的做法:
javascript
// 不推荐的做法
Array.prototype.customMethod = function() { /…/ };
// 应该创建子类
class MyArray extends Array {
customMethod() { /…/ }
}
Object.setPrototypeOf
替代 __proto__
修改ES6 的 class 本质仍是原型继承的语法糖:
javascript
class ModernArticle {
constructor(title) {
this.title = title;
}
// 方法实际存在于原型上
printTitle() {
console.log(this.title);
}
}
typeof ModernArticle.prototype.printTitle; // “function”
通过合理运用原型机制,开发者可以构建出既高效又易于维护的 JavaScript 应用架构。