问题一:
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分别是:
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
学习了
$ 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
>
@dayuoba 正解!
@leapon 多谢,理解错了你上面的意思
比较经典的一个例题,学习了
二楼正解 自豪地采用 CNodeJS ionic