堆和工厂模式中的本地对象
Local objects in heap and Factory pattern
这些是我不清楚的Nicholas Zakas书的节选,请帮我理解。
function setName(obj) {
obj.name = “Nicholas”;
obj = new Object();
obj.name = “Greg”;
}
var person = new Object();
setName(person);
alert(person.name); //”Nicholas”
函数退出后,本地对象obj死在堆中(当它也返回obj时也是一样?)
person和obj是作为堆中的单个对象相互复制还是引用?
他说:"当obj在函数内部被覆盖时,它就变成了一个指针到本地对象。该本地对象在功能完成执行后立即被销毁"。
然后,在中,他解释了工厂模式如下:
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
因为现在o是局部对象,他说"一旦函数完成执行,局部对象就会被破坏"。所以当函数返回o时,它是一个本地对象,如果i
var foo = createPerson(bla,18,student);
那么foo是对一个本地对象的引用,到那时该对象必须已经死了。请澄清"在函数中返回本地对象"的概念
很抱歉发了这么长的帖子,如果需要,请编辑和浓缩mods。
当setName
的第一行运行obj
引用指向在函数外部创建的person
对象时,该对象的名称设置为Nicholas
。因此,在此阶段obj
是在函数外部创建的引用person
的副本。
当setName
的第二行运行时,本地obj
引用被重新分配以指向一个新对象,因此当在第三行调用obj.name
时,正是这个新对象的名称更改为Greg
。person
对象不受此名称更改的影响。
在工厂函数中,说"函数一完成,本地对象就被销毁"是不正确的——对对象的本地引用被销毁,但对象本身是在堆上创建的,并且仍然存在。如果工厂函数在最后一行没有return o
,那么这个对象将被垃圾收集,因为一旦函数返回,就不存在对它的引用,但是o
不是垃圾收集的,因为函数返回了对它的参考。
相关文章:
- 如何在AngularJS工厂中正确声明对象属性
- 堆和工厂模式中的本地对象
- 返回一个新函数,而不是工厂中的对象
- 对象属性不是在工厂成员函数内部创建的
- AngularJS使用工厂来计算对对象的更改
- 角度工厂,对象范围混乱
- 从函数内部修改角度工厂对象
- 从角度工厂返回数据,返回对象后填充数据
- AngularJS获取工厂对象的实例
- 角度控制器/工厂返回未定义的对象
- JavaScript 对象原型未通过工厂返回
- 如何在 angularjs 工厂中使用 json 文件返回对象数组
- 在本地存储中持久化的角度工厂对象
- 来自工厂的 Angularjs 对象
- 如何将对象从使用PouchDB的工厂返回到控制器
- 无法使用工厂创建对象
- AngularJS 1.4x如何扩展工厂对象
- 将工厂/服务对象隔离到单个元素's指令
- node.js中的对象工厂模式
- Javascript对象工厂方法,将参数object作为参数传递