JavaScript 中的原型继承问题
Prototypal Inheritance Issues in JavaScript
我对我的应用程序使用的原型继承模式有一些疑问。首先看看我正在使用的模式;
const myObjectProto = (function() {
const proto = Object.create( parentProto );
// private variables
let title = 'Some String';
// private functions
const addEmoticon = function() {
return title + ' ';
}
proto.getTitle = function() {
return addEmoticon();
}
return proto;
})();
当我想使用它时,我会像下面这样使用它:
const firstObject = Object.create( myObjectProto );
const secondObject = Object.create( myObjectProto );
// call a public function
firstObject.getTitle();
secondObject.getTitle();
我的第一个问题是:假设我们从其相应的原型创建 100 个对象;据我所知 title
在他们之间共享。这意味着如果一个函数改变它,它会为所有创建的对象改变。我有点担心这种情况下的记忆。我是否使用这种模式来提高内存效率?有人可以阐明 Object.create
如何对待 title
吗?
我的第二个问题是关于内存泄漏的;假设我们要将 firstObject 设置为 null;
firstObject = null;
基于我们有像 title
甚至 proto
这样的共享变量这一事实,我认为它什么也没做,我有内存泄漏。我对吗?如果这是真的,我该如何解决?
title
是局部变量。只要某些代码可以访问它,它就会存在。它只会存在一次,因为 IIFE 只执行一次,因此只会创建一个变量。 addEmoticon
中的函数可以访问 title
,换句话说,它 闭包 。由于它本身就是一个本地,所以它也只有在可以访问的情况下才会存在。它在存储在 proto.getTitle
中的函数中被访问,它再次 关闭 addEmoticon
。只要可以访问proto
,proto.getTitle
就存在。由于 proto
的值存储在全局变量 const myObjectProto
中,因此它始终可以访问,因此它将永远存在(以及可以通过它访问的每个值,例如 title
).
Do I use memory efficient with this pattern?
好吧,你一次分配几个字节。假设您有几兆字节可用,那不是很多。
As far I know title is shared among them
是的。
Based on the fact that we have shared variables like title and even proto, I think it does nothing and I have memory leak.
您丢失了对存储在 firstObject
中的实例的引用,从而使其可用于垃圾收集。这可能会释放几个字节。由于原型仍可通过 secondObject
和 myObjectProto
获得,它将继续存在。
I have memory leak. Am I right?
内存泄漏是指明显的内存量,尽管其中的值不再需要使用,但仍被分配。假设您要使用 secondObject
,并从 myObjectProto
创建新实例,您存储的所有内容 仍然需要 。您的代码非常好。
我对我的应用程序使用的原型继承模式有一些疑问。首先看看我正在使用的模式;
const myObjectProto = (function() {
const proto = Object.create( parentProto );
// private variables
let title = 'Some String';
// private functions
const addEmoticon = function() {
return title + ' ';
}
proto.getTitle = function() {
return addEmoticon();
}
return proto;
})();
当我想使用它时,我会像下面这样使用它:
const firstObject = Object.create( myObjectProto );
const secondObject = Object.create( myObjectProto );
// call a public function
firstObject.getTitle();
secondObject.getTitle();
我的第一个问题是:假设我们从其相应的原型创建 100 个对象;据我所知 title
在他们之间共享。这意味着如果一个函数改变它,它会为所有创建的对象改变。我有点担心这种情况下的记忆。我是否使用这种模式来提高内存效率?有人可以阐明 Object.create
如何对待 title
吗?
我的第二个问题是关于内存泄漏的;假设我们要将 firstObject 设置为 null;
firstObject = null;
基于我们有像 title
甚至 proto
这样的共享变量这一事实,我认为它什么也没做,我有内存泄漏。我对吗?如果这是真的,我该如何解决?
title
是局部变量。只要某些代码可以访问它,它就会存在。它只会存在一次,因为 IIFE 只执行一次,因此只会创建一个变量。 addEmoticon
中的函数可以访问 title
,换句话说,它 闭包 。由于它本身就是一个本地,所以它也只有在可以访问的情况下才会存在。它在存储在 proto.getTitle
中的函数中被访问,它再次 关闭 addEmoticon
。只要可以访问proto
,proto.getTitle
就存在。由于 proto
的值存储在全局变量 const myObjectProto
中,因此它始终可以访问,因此它将永远存在(以及可以通过它访问的每个值,例如 title
).
Do I use memory efficient with this pattern?
好吧,你一次分配几个字节。假设您有几兆字节可用,那不是很多。
As far I know title is shared among them
是的。
Based on the fact that we have shared variables like title and even proto, I think it does nothing and I have memory leak.
您丢失了对存储在 firstObject
中的实例的引用,从而使其可用于垃圾收集。这可能会释放几个字节。由于原型仍可通过 secondObject
和 myObjectProto
获得,它将继续存在。
I have memory leak. Am I right?
内存泄漏是指明显的内存量,尽管其中的值不再需要使用,但仍被分配。假设您要使用 secondObject
,并从 myObjectProto
创建新实例,您存储的所有内容 仍然需要 。您的代码非常好。