Ale*_*kov 6 javascript memory-management
前几段描述了我想要实现的目标,实际问题在最后.谢谢
以前,我只是使用new关键字来创建对象,并使用原型来分配方法和处理继承.然而,最近,(部分受到CoffeeScript生成的JS的启发)我决定使用一个对象创建函数,它看起来像这样:
var Test = function(a) {
function Test(a) {
this.a = a;
}
var numCalls = 0;
Test.prototype.output = function() {
alert('I was initialized with ' + this.a);
numCalls++;
};
Test.prototype.called = function() {
alert('You called the output ' + numCalls + ' times');
};
return new Test(a);
};
Run Code Online (Sandbox Code Playgroud)
然后我会创建一个这样的新对象:
var obj = Test('string');
Run Code Online (Sandbox Code Playgroud)
与new用于每个实例的典型方法相比,这种方法有几个优点.首先,我不太可能忘记使用这个词new(我知道还有其他方法可以避免new,但从我看到他们遇到的问题与我下面描述的问题类似),其次,我很容易看到'构造函数在任何现在属于类的函数中看到的私有'变量.我测试的时候确实遇到过警告.instanceof不再有效,因为它没有看到内部对象测试.为了解决这个问题,我尝试使用构造函数属性:
var a = Test('one');
var b = Test('two');
a.constructor == b.constructor // false
a.constructor.name == b.constructor.name // true
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑.在不使用对象创建函数的情况下创建相同的对象会导致它们的构造函数相等,但在这种情况下它们会有所不同.我的猜测是,什么情况是,一个全新的对象类型被生成的每个函数运行(对象结构是相同的,但原型的实例是不同的)时间.
如果我对问题的理解是正确的,那么这也意味着代码为每个对象实例分配额外的内存给我的JavaScript,以便在实例之间共享这些函数,通过欺骗它来为每个实例创建一个相同的对象原型(击败整个使用原型的目的)?如果是这样,是否有一种避免这种情况的好方法,同时仍然保持这种模式的好处(能够在内部函数之间共享私有变量而不必使用new关键字)?
如果我误解了这个问题,有人可以告诉我实际发生了什么吗?
如果是这样,有没有一种好方法可以避免这种情况,同时仍然保留这种模式的好处......
尝试使用模块方法:
var Test = (function TestModule() {
function Test(a) {
this.a = a;
}
Test.prototype = {
};
return function(a) {
return new Test(a);
};
}());
var a = Test('foo');
var b = Test('baz');
a.constructor == b.constructor; // true
a.constructor.name == b.constructor.name; // true
Run Code Online (Sandbox Code Playgroud)