为什么子类的原型要指向父类的实例而不是父类的原型

一道面试题
为什么子类的原型要指向父类的实例而不是父类的原型

阅读 4.8k
3 个回答

我觉得,并不是语法上不能实现对构造函数的参数传递,而是这样做不符合面向对象编程的规则:对象(实例)才是属性的拥有者。
如果在子类定义时就将属性赋了值,对象实例就不能再更改自己的属性了。这样就变成了类拥有属性,而不是对象拥有属性了。
举个例子,子类 Children 继承父类 Parents,Parents 构造函数:
function Parents(name){ this.name=name; }
使用原型链并给父类构造函数传参数:
Children.prototype=new Parents("Hello");
那么此时,Children 类就拥有了 name=“Hello” 属性,而 Children 类的实例对象 c1、c2、c3 等等只能被迫接受这个 name 属性。Children 是 "Hello" 的拥有者而 c1、 c2、c3不是!
如此写完全失去了面向对象编程的意义,所以在原型链继承方式中规定不能对父类构造函数传递参数。也因为这个原因,原型链继承方式并不实用。

function P(){}
function C(){}

var p = new P(); 
C.prototype = p; 

这样写的好处是子类如果更改了prototype,那么更改的东西也是附加到p这个实例上的

如果你直接写C.prototype = P.prototype,那你对C的prototype的任何修改都会同时修改P的prototype

原型继承么,原型链

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题