- 94
- 0
本人刚开始学习js,在《js高程》上看到了寄生组合式继承这一节,但是对书上给出的代码不太明白。
我理解的是:寄生组合式继承是为了避免组合继承中实例属性和原型对象中属性重复的问题,它使用借用构造函数的方法继承父类构造函数中的属性,使用原型式继承的方法继承父类的原型对象。
这是书上的代码:
function inheritPrototype(SubType,SuperType){
var pro = Object.create(SuperType.prototype);
pro .constructor = SubType;
SubType.prototype = pro ;
}
但是,它和下面的函数有什么区别呢?
function inheritPrototype(SubType,SuperType){
SubType.prototype = SuperType.prototype;
SubType.prototype.constructor = SubType;
}
不太明白为什么要使用原型式继承的方法继承父类的原型,原型式继承不就是一个浅复制吗?这和直接赋值有什么区别呢?
- 共 0 条
- 全部回答
-
Wouldyoulike. 普通会员 1楼
在JavaScript中,寄生组合式继承是一种混合了原型式继承和构造函数继承的继承模式,它能有效避免传统原型链继承和借用构造函数继承的缺点。
在传统的原型链继承中,子类会共享父类的引用类型属性,这会导致数据污染问题。而在借用构造函数(也称作经典继承)中虽然可以为每个实例创建独立的属性副本,但无法继承父类的原型方法,并且会调用两次父类构造函数,效率较低。
寄生组合式继承的核心思想是:
- 使用构造函数继承来实现对父类实例属性的继承,保证每个子类实例都有自己的属性副本。
- 使用原型式继承(或Object.create()方法)来继承父类的原型属性和方法,而不是整个原型对象,这样可以避免引用类型的属性被所有子类实例共享的问题。
具体步骤大致如下:
```javascript function inheritPrototype(subType, superType) { var prototype = Object.create(superType.prototype); // 创建一个空的对象,其原型指向superType.prototype prototype.constructor = subType; // 修复constructor指向 subType.prototype = prototype; // 将新创建的对象赋值给subType.prototype }
function SuperType(name) { this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function () { console.log(this.name); }
function SubType(name, age) { SuperType.call(this, name); // 继承实例属性 this.age = age; }
inheritPrototype(SubType, SuperType); // 继承原型属性和方法
var instance1 = new SubType("Tom", 20); var instance2 = new SubType("Jerry", 22);
instance1.colors.push("black"); console.log(instance1.colors); // ["red", "blue", "green", "black"] console.log(instance2.colors); // ["red", "blue", "green"] 不受instance1影响 ```
因此,使用原型式继承的方法继承父类的原型,能够同时兼顾到继承实例属性和原型属性/方法,而且不会造成不必要的资源浪费,是一种更为高效、安全的继承方式。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

