在构造函数中使用 'this' 关键字是否会增加整体内存使用量?



例如:

function Constructor() {
this.peoperty = 1;
this.myMethod1 = function() {
//do something
};
this.myMethod2 = function() {
let a = myMethod3();
}

/*no 'this' keyword for myFunction3,because 
I am not going to call myFunction3 anywhere else,
except inside this particular Constructor*/
myMethod3 = function() {
let b = 0;
return b;
};
}
var hello = new Constructor();

我假设this关键字在创建变量使用关键字时new引用实例。

问题是,如果myMethod3仅在该构造函数中调用,我是否可以不使用this关键字进行myMethod3,因为我不会在我的代码中的任何位置使用hello.myMethod3。这在运行时是否节省了一些内存,因为我想只有与this关键字绑定的属性/方法才会占用使用new关键字创建的每个实例的内存空间?

是的,你的猜测是正确的,如果你在构造函数中声明一个方法,每个实例都有自己的定义:

function Cat() {
this.meow = function() {
console.log('meow');
}
}
const cat1 = new Cat();
const cat2 = new Cat();
cat1.meow();
cat2.meow();
console.log(cat1.meow === cat2.meow);

如果您使用 prototype 关键字,则不会发生同样的情况。在这种情况下,两个对象都将有一个指向同一定义的指针:

function Cat() {
}

Cat.prototype.meow = function() {
console.log('meow');
}
const cat1 = new Cat();
const cat2 = new Cat();

cat1.meow();
cat2.meow();
console.log(cat1.__proto__.meow === cat2.__proto__.meow);

在当前代码中,您没有声明myFunction3,因此该函数将在全局范围内,并且Constructor的每个新实例化都将覆盖以前的myFunction3

const instance = new Constructor();
myFunction3 = () => alert("whoops");
instance.myFunction2(); // "whoops"

因此,一次只有一个myFunction3,这样可以节省内存,但是在构造函数中重新声明它是没有意义的(不声明变量从来没有意义)。


假设您正确声明了它:

function myFunction3() {
let b = 0;
return b;
};

那么你根本不会保存任何内存,因为对myFunction3的引用保存在你分配给this的其他函数的闭包中,因此myFunction3必须在内存中停留的时间与this所指的任何实例一样长。如果你这样做

this.myFunction3 = function() { /*...*/ };

只要this存在,它也会留在内存中,所以从内存的角度来看,它们实际上是相等的。但是myFunction3有些"私有",因为它无法通过this访问。

最新更新