在最小化内存使用的同时调用对象数据的原型函数

时间:2019-11-26 00:11:38

标签: javascript performance

学习Javascript;我想通过使用原型函数(#2)减少内存使用。但是,为了将实例的相关状态/参数传递给原型函数,我需要创建另一个函数(#1)。

我了解在Javascript中,将为每个Row实例创建对象方法(#1),从而避免了因重用原型函数(#2)而节省的内存。如果我用闭包替换功能1,也会节省内存。

每个Row对象有没有一种方法可以在Row自身唯一的状态上调用原型函数,同时又可以最大程度地减少内存使用?

function Row(data) { 
  row = Object.create(Row.prototype);
  row.state = data;

  //#1
  row.showInstanceState = function() {
    Row.prototype.showState(this.state);
  };

  return row; 
}

//#2
Row.prototype.showState = function(info) {
    console.log(info);
}

let example = new Row(2);

/*
If function #1 didn't exist, the call 
below saves memory but we have explicitly pass 
in an instance's data at the moment of the call. 
*/
example.showState(example.state);

//The call style below is desired, but requires function #1, which would not optimize memory usage.
example.showInstanceState();

1 个答案:

答案 0 :(得分:1)

使用new关键字时,基本上是在运行Row()的功能时,this指向一个新(自动)创建的对象并返回该对象。因此,您的函数构造函数应如下所示:

function Row(data) { 
  this.state = data;
}

使用new时已经分配了对象及其原型。

然后您可以添加原型方法:

Row.prototype.showInstanceState = function() {
  console.log(this.state);
};

当您将方法作为实例成员调用时,this将始终指向实例对象(除非您使用的是callapply),因此this.state将指向实例自己的属性(您在构造函数中创建的属性)。

let example = new Row(2);
let example2 = new Row(5);

example.showInstanceState(); // 2
example2.showInstanceState(); // 5