扫码关注官方订阅号
一道面试题为什么子类的原型要指向父类的实例而不是父类的原型
业精于勤,荒于嬉;行成于思,毁于随。
我觉得,并不是语法上不能实现对构造函数的参数传递,而是这样做不符合面向对象编程的规则:对象(实例)才是属性的拥有者。如果在子类定义时就将属性赋了值,对象实例就不能再更改自己的属性了。这样就变成了类拥有属性,而不是对象拥有属性了。 举个例子,子类 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
原型继承么,原型链
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
我觉得,并不是语法上不能实现对构造函数的参数传递,而是这样做不符合面向对象编程的规则:对象(实例)才是属性的拥有者。
如果在子类定义时就将属性赋了值,对象实例就不能再更改自己的属性了。这样就变成了类拥有属性,而不是对象拥有属性了。
举个例子,子类 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不是!
如此写完全失去了面向对象编程的意义,所以在原型链继承方式中规定不能对父类构造函数传递参数。也因为这个原因,原型链继承方式并不实用。
这样写的好处是子类如果更改了prototype,那么更改的东西也是附加到p这个实例上的
如果你直接写C.prototype = P.prototype,那你对C的prototype的任何修改都会同时修改P的prototype
原型继承么,原型链