JavaScript 将共享属性迁移到原型中去的实现方法

作者:小括号时间:2026-10-30 13:09:45浏览:251

本文介绍在 JavaScript 中如何将构造函数内的共享属性迁移至原型对象。通过对比实例属性与原型属性的内存占用,说明将不可变公共属性(如 name)移至原型可实现所有实例共享,从而显著提升内存效率并优化属性查找性能。

原型共享属性的原理与优势

在使用构造函数创建对象实例时,属性通常被直接添加到 this 对象上。由于这些属性属于每个实例的私有空间,它们不会随实体变化而共享,这种做法在需要大量实例时显得效率低下。例如:


function her(){
  this.name = 'Anna';
}

这意味着每次通过 new her() 创建新实例时,都会生成一个独立的 name 属性,并在内存中分配独立的存储空间。实际上,我们可以将 name 属性定义在原型上,使得所有实例共享同一个 name 属性:


function her(){}
her.prototype.name = 'Anna';

这样,通过 new her() 创建的对象不再拥有私有的 name 属性,而是从原型中继承。虽然这种方法能显著提升效率,但它仅适用于不可变属性。如果属性值可变,修改一处会导致所有实例的属性值同步改变,这通常不符合预期。因此,公有且不可变的属性最适合采用此方法。

下面,我们来改进以前的一个例子:

原型扩展与继承的注意事项


function her(){};
her.prototype.name = 'Anna';
her.prototype.toString = function(){
  return this.name;
}

function his(){};
his.prototype = new her();
his.prototype.constructor = his;
his.prototype.sex = 'women';

如代码所示,在扩展原型对象之前,必须先完成继承关系的构建。否则,后续对 her.prototype 添加的新属性或方法可能会覆盖继承自父类的原有内容。


function child(f, m){
  this.eat = f;
  this.don = m;
}
child.prototype = new his();
child.prototype.constructor = child;
child.prototype.name = 'Jok';
child.prototype.fun = function(){
  return this.eat + this.don
}

如代码所示,调用 toString() 方法在底层仅涉及少量操作差异。主要区别在于属性查找过程:对于原型中定义的属性,JavaScript 引擎会在 her.prototype 中进行更多的查找工作。

以上这篇 javascript 将共享属性迁移到原型中去的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

作者最新文章