不知道为什么会报错,麻烦js大神给排查一下
报错say方法不存在
完整代码:
function person(name,age){
this.name=name;
this.age=age;
}
function coder(name,age,job){
person.call(this,name,age);
this.job=job;
}
person.prototype.say=function(){
alert("我叫"+this.name);
}
function phh(){};
var ph=new phh();
phh.prototype=person.prototype;
coder.prototype=ph;
coder.prototype.constructor=coder;
coder.prototype.coding=function(){
alert("我在"+this.job);
}
var p=new person("leo",32);
p.say();
var v=new coder("momo",23,"敲代码");
v.say(); //此处报方法不存在
v.coding();
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
至于为什么报错:
用构造器构造新对象时,新对象的原型指向当前构造器的原型,如果之后构造器的原型被指向其它对象,这一修改不会在已经构造的对象上有所体现。只有在原地修改对象时(不改变引用,只增添/修改/删除属性时)才会体现出来。
显然在构建 ph 的时候,构造器的原型 phh.prototype 还指向默认值,所以构造出的 ph 就不以 person 为原型了。
调整下顺序
顺便,
帮你重构了一下
继续重构:
进一步重构:
简化:
输出:
代码太乱了,我实在整理不过来,不过看到问题了:
原因自己再好好想想
以下是我对@leftstick的答案的理解:
function phh(){};声明函数,phh.prototype将指向堆内存中一个区域,假定为区域avar ph = new phh();ph的__proto__属性,会通过phh.prototype找到区域a,并指向它(其实就是引用类型的赋值)phh.prototype = anotherObjphh.prototype将指向一个新的区域,但是ph.__proto__还是指向的区域a以上问题可以简化成如下代码
v的原型对象是ph,ph的原型对象是Person.prototype。
js查找属性先从当前对象开始查找,然后沿着原型链,一直到Object.prototype 没有找到就报错
@bf 说的比较明白了,具体可以看下 js 高程中,第六章-创建对象-原型的动态性。
主要是这句出了问题
因为原型也是对象,这句切断了构造函数和最初原型之间的联系。
楼上正解。。。
构造函数首字母建议大写!
leo,momo,这是秒味的吧。。。