1、请问p.name是:
var fun = function(){
this.name = 'ling';
return {
name: 'ge'
};
}
var p = new fun();
考察的是构造函数的返回值的问题, 每个函数都有返回值,如果使用了return
语句,则返回return
后跟的值,如果没有使用return
,则默认返回undefined
.
特别的,如果这个函数是构造函数,则默认返回this
对象,如果构造函数内使用了return
语句,并且return
后跟的是一个对象,则这个构造函数返回的是这个对象,否则返回this
.
所以题中的p = {name: 'ge'}
,因此p.name=ge
2、请问p.name是:
var fun = function(){
this.name = 'ling';
return 'ge';
}
var p = new fun();
由于返回值不是对象,因此,返回this。输出结果:p = {name: 'ling'}
,因此,输出结果为ling
修改prototype
上的属性问题
1、请问a.info.name和b.info.name分别是
var fun = function(){}
fun.prototype = {
info : {
name : 'linge',
age : 12
}
}
var a = new fun();
var b = new fun();
a.info.name = 'hello';
b.info.name = 'tom';
两个都输出tom。首先你要知道原型模式的执行流程:
1.先查找构造函数实例里的属性或方法,如果有,就立即返回。
2.如果构造函数的实例没有,就去它的原型对象里找,如果有,就立即返回
由于构造函数中没有info属性,因此,a.info.name = ‘hello’;就是给原型的info的name设置为hello。首先要查找有没有info属性,才能给实例的某个属性赋值,于是找到了原型上。第二次,还是构造函数没有,去原型找,b.info.name = 'tom’将原型的info的name改为tom,由于info是对象,引用地址相同,最终二者获取结果都是tom。
a.info.name这段代码,首先去访问了实例对象本身是否有info这个对象,发现没有就去原型上查找了,发现原型上有,所以地址共享了得到的值都是Tom;
2、请问a.info.name和b.info.name分别是:
var fun = function(){
this.info = {
name : 'linege',
age : 20
}
}
var a = new fun();
var b = new fun();
a.info.name = '功夫';
b.info.name = '熊猫';
a.info.name
为功夫
,b.info.name
为熊猫
。
由于构造函数有,就不再去原型查找,new之后都会创建新的实例对象,他们this各自指向各自创建新对象中。互不影响。因此,输出各自的。
3、请问a.name和b.name分别是:
var fun = function(){}
fun.prototype = {
name : 'ling',
age : 20
}
var a = new fun();
var b = new fun();
a.name = 'nginx';
b.name = 'mobx';
a.name
输出nginx,b.name
输出mbox。
a.name实例本身没有,给当前a这个实例对象执行赋值操作,没有去访问原型上的name。就相当于第1题先访问了原型上的info对象,第3题没有访问过程,只是在实例上添加了name属性值。
4、请问a.info.name和b.info.name分别是:
var fun = function(){
this.info = {
name : 'ling',
age : 20
}
}
fun.prototype = {
info : {
name : 'ling',
age : 20
}
}
var a = new fun();
var b = new fun();
a.info.name = 'dog';
b.info.name = 'cat';
a.info.name
为dog
,b.info.name
为cat
。 这个是由于自身有info属性,都不会去原型找,由于new以后各自info地址都不同,因此,输出各自的。