今天想再深入理解一下原型继承,发现以下这两种继承方式都没什么问题,请问大牛们,这两种方式有区别吗,区别是啥?
function People(){}
People.prototype = {role : 'user'}
function Male(){}
Male.prototype = People.prototype;
var m = new Male()
m.role // 输出 user
m instanceof People // 输出 true
function People(){}
People.prototype = {role : 'user'}
function Male(){}
Male.prototype = new People(); // 这里跟上面定义方式不同
var m = new Male()
m.role // 输出 user
m instanceof Male
有区别!
原形链不一样。第一个的原型链是:
m->People.prototype
,第二个的原型链是:m->{// People实例}->People.prototype
提问者提问:这两种写法除了原型链条上的区别外,如果在运用到实际的工作中,会不会遇到坑?
会!!第一种比较可能遇到坑!看代码:
第一种继承实现:
第二种继承实现:
当然对于第一种继承实现,也是有方法避免报错的:
总结:在javascript的原型继承的世界里,这是十分灵活自由的,所以当然也会存有很多很多的坑。对于很多初学者或小白(比如我)是很难明白那种方法比较正统,也很难明白那种方法比较正确,但这不重要,毕竟这些
‘哲理’上的东西需要经验的积累
,但至少需要知道当发生报错时,究竟是什么错并如何解决!
PS:对于第二种继承实现和对第一种继承实现的完善同样是有区别的。