9
回答
关于prototype的问题。看有没有高手
注册华为云得mate10,2.9折抢先购!>>>   
var fun = function(){
}

fun.prototype = {
info : {
name : 'peter',
age : 25
}
}

var a = new fun();
var b = new fun();

a.info.name = 'jack';
b.info.name = 'tom';

求:

a.info.name,b.info.name

问:为什么是这个结果?请给出详细解答
举报
酱哥哥
发帖于3年前 9回/215阅
共有9个答案 最后回答: 3年前

引用来自“rouyh”的评论

因为a和b都没有info,所以是加在fun的prototype原型上的。
var fun = function(){ 


fun.prototype = { 
name : 'peter', 
age : 25 


var a = new fun(); 
var b = new fun(); 

a.name = 'jack'; 

b.name = 'tom'; 


那这样呢 ?

引用来自“Narky”的评论

看这幅图就明白了,原型链问题

能帮忙说明一下吗,针对问题点拨一下,也许我会懂的。原型链的原理我也看了,但是这个问题我就是无法理解

引用来自“Narky”的评论

看这幅图就明白了,原型链问题

引用来自“酱哥哥”的评论

能帮忙说明一下吗,针对问题点拨一下,也许我会懂的。原型链的原理我也看了,但是这个问题我就是无法理解

用户自定义的属性会遮蔽原型链继承过来的属性

比如最先的问题,如果你写

a.info = { name : 'jack' }

这样就不会覆盖原始属性info.name了

这里还有一篇文章,可以看看

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

你想要达到你要的效果,就不能用 prototype,好像prototype的对象是共享内存的。
var fun = function(){
    this.info = {
        name:'peter',
        age: 25
    }
}

可以通过以上代码实现。

引用来自“rouyh”的评论

因为a和b都没有info,所以是加在fun的prototype原型上的。

引用来自“酱哥哥”的评论

var fun = function(){ 


fun.prototype = { 
name : 'peter', 
age : 25 


var a = new fun(); 
var b = new fun(); 

a.name = 'jack'; 

b.name = 'tom'; 


那这样呢 ?

这样的话a.info.name = b.info.name = 'peter';

引用来自“nidongwo-”的评论

你想要达到你要的效果,就不能用 prototype,好像prototype的对象是共享内存的。
var fun = function(){
    this.info = {
        name:'peter',
        age: 25
    }
}

可以通过以上代码实现。

谢谢你,我就想搞懂概念

楼上所说的例如:a.info = {}这种的话是加在a这个实例上的,不会放到原型上。

就是在a的实例上加了一个属性info了,而这个info是不会英雄fun的原型里的info属性的。

而如果a的实例没有info的属性,而你又这样a.info.name = '',这样做就会去找fun的属性了。

而如果fun的原型中没有info你就不能这样做了,这样就会出错。

(假如fun原型中没有info)因为这样的话a.info没有定义,而给一个没有定义的对象赋属性这合理吗?

顶部