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-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这道题有点‘君生我未生,我生君已老’的意思吧。
你大可以在后面再生成一个Man的实例,查看它的name属性
在生成m实例的时候,Man.prototype还不是一个Man的实例。其后再生成一个Man实例时,Man.prototype已经变成你前面设置的样子。
当读取一个对象(
obj)的属性(property)时候,其实解释器查找的是obj.propertyobj.__proto__.property...找到的第一个。而:
这样写是不行的。但是可以这样:
这样,
m = new Man();那么m.name就是你想要的值了,其实他是m.__proto__.name;但是它是只读的,所以m.name = "newName"其实只是重新给m创建了一个熟悉name,原来的m.__proto__.name还是存在的(但是保存它没有什么意义).而且,
m instanceof man也也是不工作的。总上,这样做一点儿好处也没有反而有很多的坏处,所以还是正统的写法比较好。第二段代码工作的原因是,
Person.prototype.sayName=...并没有改变Person.prototype只是给他添加了新的属性。如果继承如同这段代码一样:这样,程序里只存在一个
Man.prototype,而要创建多个Man类型的对象,怎么保存多个名字?????!关于原型链参考:http://zonxin.github.io/post/...
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。
其根本还是变量赋值的问题,如下