请大家帮忙讲解两个问题
发布于 9 年前 作者 jiangli373 5166 次浏览 最后一次编辑是 8 年前 来自 问答

问题一:

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分别是:

问题二:

var fun = function(){}

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

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

a.name = 'jack';
b.name = 'tom';
//请问a.name和b.name分别是:
13 回复

tom,tom,jack,tom 到家在补上解释吧,下班了

运行了下代码,果然如楼上所说。 JS刚学习,试解释。 所有实例共享一个prototype对象. 第一道题里的info指向prototype对象的引用。所以a.info和b.info是同一个对象。a.“prototype” === b.“prototype”, a.info===a.“prototype”.info===b.“prototype”.info===b.info

第二道题,更改了实例的name属性,导致在新实例上创建了新的name属性,覆盖了prototype的同名属性. a.name != a.“prototype”.name, b.name != b.“prototype”.name

对不起,不知道怎么引用实例的prototype(.__prototype? __),所以加了引号。

实例化的时候new func();会使实例的__proto__指向func 的prototype 也就是a.__proto__ = func.prototype 第一段代码a.info.name 执行的时候a本身没有info属性,所以会查找a.__proto__.info,b也是同样的情况。所以就是两次赋值操作都是对于同一个对象,func.prototype.info.name 第二段代码是a.name实例自身的属性

可以用 hasOwnProperty 函数验证一下属性是自身的,还是 prototype 继承的。

问题一:
> a.hasOwnProperty('info')
false
问题二:
> a.hasOwnProperty('name')
true

@leapon 好像不对吧,我刚才试了下,返回都是false 自豪地采用 CNodeJS ionic

谢谢上面朋友的回答,说下我自己的理解,问题一的赋值首先要判断a.info存在不存在,不存在,然后像原型里面找,原型里面存在,然后就改变了原型的值了,所以最后输出的一样了,然后第二个问题是赋值,不涉及读取,如果没有这个属性,则添加这个属性并赋值,如果有则覆盖这个值。不知道这样理解对不服 自豪地采用 CNodeJS ionic

@jiangli373

$ node
> var fun = function(){}
undefined
> 
undefined
> fun.prototype = {    
...     name : 'peter',    
...     age : 25    
... }
{ name: 'peter', age: 25 }
> 
undefined
> var a = new fun();
undefined
> var b = new fun();
undefined
> 
undefined
> a.name = 'jack';
'jack'
> b.name = 'tom';
'tom'
> a.hasOwnProperty('name')
true
> 


@leapon 多谢,理解错了你上面的意思

比较经典的一个例题,学习了

二楼正解 自豪地采用 CNodeJS ionic

回到顶部