function Person(name,age,job){
this.name = name;
this.age = age;
this.ob = job;
}
function Man(name,age,job,mustache){
this.mustache = mustache;
Man.prototype = new Person(name,age,job);
}
var m = new Man('Anthony',27,'PE');
m.name;//undefined
这里的m.name 是undefined 的,但是可以确定的是在构造函数体内是可以访问构造函数本身的原型的,如下:
function Person(name,age,job){
this.name = name;
this.age = age;
this.ob = job;
if(typeof this.sayName != 'undefined'){
Person.prototype.sayName = function(){
alert(this.name)
}
}
}
var p = new Person('anthony',29,'PE');
p.sayName();//anthony
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这道题有点‘君生我未生,我生君已老’的意思吧。
你大可以在后面再生成一个Man的实例,查看它的name属性
在生成m实例的时候,Man.prototype还不是一个Man的实例。其后再生成一个Man实例时,Man.prototype已经变成你前面设置的样子。
new操作符在为新对象设置原型继承 (将新对象的
__proto__设为构造函数的prototype) 之后 才会调用构造函数。所以关于委托或者继承,可以用
既然是继承,子类向父类传递参数是什么鬼?
当通过new操作符创建一个Man对象实例m时,JS引擎会首先创见一个对象,this关键字指向这个对象,并且其原型对象为函数的默认原型对象A;
在函数Man的执行过程中其原型对象发生变化,指向了Person的实例对象B,但是这个并不能改变当前this关键字指向的对象及其原型对象A
当Man函数执行结束后,this关键字指向的对象赋值给m,那么m的__proto__指向的原型对象为Man的默认原型对象A
而Man函数的原型对象变更为B
导致的结果为
第1次执行new Man后,Man的prototype被改变为B,但是创建的实例的指向的原型对象A并不发生变化,也就是实例的__proto__执行不发生变化。
第2次执行new Man后,Man的prototype被改变为C,创建的实例的指向的原型对象B并不发生变化,也就是实例的__proto__执行B。
第2次执行new Man后,Man的prototype被改变为D,创建的实例的指向的原型对象C并不发生变化,也就是实例的__proto__执行C。
其根本还是变量赋值的问题,如下