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

Local objects in heap and Factory pattern

本文关键字:对象 工厂 模式      更新时间:2023-09-26

这些是我不清楚的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时,正是这个新对象的名称更改为Gregperson对象不受此名称更改的影响。

在工厂函数中,说"函数一完成,本地对象就被销毁"是不正确的——对对象的本地引用被销毁,但对象本身是在堆上创建的,并且仍然存在。如果工厂函数在最后一行没有return o,那么这个对象将被垃圾收集,因为一旦函数返回,就不存在对它的引用,但是o不是垃圾收集的,因为函数返回了对它的参考。