日期:2014-05-16  浏览次数:20446 次

还是继承的问题,求助
先看2段代码
(1)
function Man(age) {
    this.age = age;
};

Man.prototype.show = function () {
    alert(this.age);
};

function Women(age) {
    this.age = age;
}
Women.prototype = new Man();
Women.constructor = Women;

var test = new Women("20");
test.show();//没有什么问题显示20
----------------------
(2)
var a=function Man(age) {
    this.age = age;
};

Man.prototype.show = function () {
    alert(this.age);
};

function Women(age) {
    this.age = age;
}
Women.prototype = new a();
Women.constructor = Women;

var test = new Women("20");
test.show();
//为什么仅仅修改了红色部分,就提示没有此方法
//我的理解是,Man构造函数赋给了一个变量a,然后new a()和new Man()不是一样的效果马?!
//为什么不能继承方法阿,其指点!

------解决方案--------------------
你这想法还真是奇特,不过我还真是没有想过可以这么写。

我猜测吧,这不能实现的原因应该跟函数定义的这种方法有关,var a = function(){};
跟这种定义函数的方法有关,具体什么关系,没有想过,现在也说不了啥。

猜测一下吧:
构造函数的写法,和赋值的函数写法的本质不同,就是,构造函数的写法,会在预编译的时候,就会执行了。
而赋值的写法,只有当解析到这个赋值语句的时候,才会执行。

那么你这里的那个构造函数,你觉得是在编译的时候,就存在了吗?我觉得应该不是吧。

那么既然不是,他就跟构造函数的那种函数定义方法,在本质上就不同了,所以这里,它也不能算是一个构造函数了吧?

那既然不是,它怎么能当做构造函数使用呢?

编程语言嘛,肯定都是有自己的规则的,那既然这样的写法是不符合规则的,那么肯定就会被处理掉了啊。

差不多就是这样,个人猜测,仅供参考。
------解决方案--------------------
不是a 没有,是Man没有。
至于Man,在旧的IE浏览器中,好像是有。

http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname
xyz is going to be defined as usual, abc is undefined in all browsers but IE — do not rely on it being defined
------解决方案--------------------

var a=function Man(age){
   this.age = age; 
};
改为
function Man(age){
   this.age = age; 
};
var a=Man;
就可以了