日期:2014-05-16  浏览次数:20318 次

js中构造函数的prototype属性的引用问题。
<html>
<body>
<script language="javascript">
function fn(){}
fn.prototype={ attr1:"aaa", attr2:"bbb",attr3:function(){alert('')}};
var obj=new fn();
document.write(obj.attr1 + "<br />"); //result: aaa
document.write(obj.attr2 + "<br />"); //result: bbb
document.write(obj instanceof fn); //result: true
document.write("<br/>");
fn.prototype=null;
document.write(obj.attr1 + "<br />"); //result: aaa
document.write(obj.attr2 + "<br />"); //result: bbb
document.write(obj.attr3 + "<br />");
</script>
</body>
</html>

看第二段代码:

<html>
<body>
<script language="javascript">
function fn(){}
fn.prototype={ attr1:"aaa", attr2:"bbb",attr3:function(){alert('')}};
var obj=new fn();
document.write(obj.attr1 + "<br />"); //result: aaa
document.write(obj.attr2 + "<br />"); //result: bbb
document.write(obj instanceof fn); //result: true
document.write("<br/>");
fn.prototype.attr1="ccc";
document.write(obj.attr1 + "<br />"); //result: ccc
document.write(obj.attr2 + "<br />"); //result: bbb
document.write(obj.attr3 + "<br />");
</script>
</body>
</html>

我想问的是:
为什么第一段代码在fn.prototype=null;后obj为什么还能访问到attr1,attr2,attr3?显然fn.prototype引用的是{ attr1:"aaa", attr2:"bbb",attr3:function(){alert('')}};对象,通过第二段代码也可以看出fn.prototype是可以操作他引用的对象的。
js prototype javascript function html

------解决方案--------------------
你的问题等同于:

fn.prototype={ attr1:"aaa", attr2:"bbb",attr3:function(){alert('')}};
var foo = fn.prototype;
fn.prototype=null;
这时问 foo.attr1 可以访问吗?
我想你也明白 foo.attr1 当然可以访问。

现在回到你的原来的问题:

var obj=new fn();
这行包括 obj._prototype = fn.prototype;
当然了,你看不见“obj._prototype”(_prototype是假设的名字,也可能用其它名字)。

fn.prototype=null 后,暗藏的obj._prototype仍然记得原来的值。
所以当 访问 obj.attr1 时,它的值就是 obj._prototype.attr1 !