堆和工厂模式中的本地对象

时间:2012-09-04 10:00:05

标签: javascript object return local factory

这些是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是一个本地对象,如果我

var foo = createPerson(bla,18,student); 

然后foo是对本地对象的引用,到那时它必须是死的。请澄清“在函数中返回本地对象”的概念

很抱歉这篇文章很长,如果需要,请编辑和缩小。

1 个答案:

答案 0 :(得分:1)

setName的第一行运行obj引用指向在函数外部创建的person对象时 - 此对象的名称设置为Nicholas。因此,在此阶段obj是在函数外部创建的引用person的副本。

setName的第二行运行时,将重新分配本地obj引用以指向新对象,因此当在第三行上调用obj.name时,它就是这个新对象其名称已更改为Gregperson对象不受此名称更改的影响。

在工厂函数中,说“一旦函数完成就会破坏本地对象”是不正确的 - 对象的本地引用被破坏,但对象本身是在堆上创建但仍然存在。如果工厂函数在最后一行没有return o,那么这个对象将被垃圾收集,因为一旦函数返回就不存在对它的引用,但是o不是垃圾收集因为对它的引用由函数返回。