Javascript 堆和工厂模式中的本地对象
这些是尼古拉斯·扎卡斯的书的摘录,我不清楚,请帮我理解Javascript 堆和工厂模式中的本地对象,javascript,object,return,local,factory,Javascript,Object,Return,Local,Factory,这些是尼古拉斯·扎卡斯的书的摘录,我不清楚,请帮我理解 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是作为堆中的单个对象相互
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是在函数外部创建的参考人员的副本
当setName
的第二行运行时,本地obj
引用被重新分配以指向一个新对象,因此当在第三行调用obj.name
时,就是这个新对象的名称更改为Greg
。person
对象不受此名称更改的影响
在工厂函数中,说“本地对象在函数完成后立即被销毁”是不正确的,因为对对象的本地引用被销毁,但对象本身是在堆上创建的,并且仍然存在。如果工厂函数没有在最后一行返回o
,则此对象将被垃圾收集,因为一旦函数返回,对它的引用将不存在,但是o
不会被垃圾收集,因为函数返回了对它的引用