在Mozilla/Konqueror的浏览器中,对象的__proto__属性指向creator function的prototype属性
那下面这段代码,如何解释
function foo(){}
bar = new foo();
foo.prototype = new Object();
foo.prototype.constructor现在是Object()
照里说bar.__proto__.constructor也应该是Object()
但是实际上,我测试下来,bar.__proto__.constructor却仍旧是foo
请帮我指出问题出在哪?Thanks
PHP中文网2017-04-10 12:46:52
严格来说,__proto__指向的不是prototype,而是指向prototype所指向的那个对象。
你创建了一个函数对象foo。所以,foo.prototype指向一个Object对象:
1: function foo(){}
然后,以foo对象为原型创建了一个bar对象。所以,bar.__proto__指向foo.prototype所指向的这个对象,也就是指向同一个Object对象:
2: bar = new foo();
最后,让foo.prototype指向一个新的Object对象。注意,此时,bar.__proto__并没有人去修改它,仍然指向原来的Object对象:
3: foo.prototype = new Object();我是看图说话分割线
执行完bar = new foo();
后,是这样:
foo.prototype bar.__proto__ \ / \ / \ / \ / Object
而不是这样:
bar.___proto___ | | foo.prototype | | Object
阿神2017-04-10 12:46:52
没人回答,我杜撰一个吧:
bar.__proto__引用的是foo{},并不是引用foo.prototype,
虽然改了foo.prototype,但是并不影响bar._proto__引用foo{}
ringa_lee2017-04-10 12:46:52
虽然是引用类型,但是后来你new了一个Object,所以prototype就引用了object,而__proto__没有变,所以就是这样的结果了。
简单来说就是new会破坏这种object或者function变量的引用关系。