Comments (1)
1.原型链继承
主要问题是包含引用类型值的原型,会被所有实例共享,一实例修改引用类型的值(比如往数组中添加、删除元素)会在所有实例中反映出来。还有一个问题就是楼主说的无法给超类型传递参数。
2.借用构造函数
解决了原型链接继承中包含引用类型值所带来问题。也可以给超类型构造函数传递参数。但是仅仅使用借用构造函数无法避免构造函数模式存在的问题,方法都在构造函数中定义,没有函数复用。而且超类型的原型中的方法,对子类型是不可见的。
3.组合继承(常用的继承方式)
组合继承,也叫伪经典继承。是原型链和借用构造函数的组合。思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。既通过在原型上定义方法实现了函数
复用,又能够保证每个实例都有它自己的属性。
4.原型式继承
就是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。
function object(o){
function F(){}
F.prototype = o;
return new F();
}
ES5新增的Object.create()方法就是规范化了的原型式继承函数。不过,包含引用类型值的属性始终都会共享相应的值的问题是存在的和使用原型链继承一样。
5.寄生式继承
就是在原型式继承的基础上为生成的对象再添加一些特有的方法,代码如下:
function createAnother(original){
var clone = object(original); //通过调用函数创建一个新对象
clone.sayHi = function(){ //以某种方式来增强这个对象
alert("hi");
};
return clone; //返回这个对象
}
使用寄生式继承来为对象添加函数,会由于不能做到函数复用而降低效率;这一点与构造函数模式类似。
6.寄生组合式继承
组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数内部。解决这个问题方法就是寄生组合式继承。
所谓寄生组合式继承,即通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。其背后的基本思路是:不必为了指定子类型的原型而调用超类型的构造函数,我们所需要的无非就是超类型原型的一个副本而已。本质上,就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。寄生组合式继承的基本模式如下所示。
function inheritPrototype(subType, superType){
var prototype = object(superType.prototype); //创建对象
prototype.constructor = subType; //增强对象
subType.prototype = prototype; //指定对象
}
这个函数接收两个参数:子类型构造函数和超类型构造函数。在函数内部,第一步是创建超类型原型的一个副本。第二步是为创建的副本添加constructor 属性,从而弥补因重写原型而失去的默认的constructor 属性。最后一步,将新创建的对象(即副本)赋值给子类型的原型。
from my-blog.
Related Issues (20)
- 专题8: 设计模式之装饰器模式
- 专题9: 发布订阅者模式
- 专题10: js 是如何引用 css 的?
- 专题11: 将js/css打包进html,并配置 devServer
- 专题12: 配置loader如:ts、babel、less|sass
- 专题13: webpack性能优化上(Code Splitting、Tree Shaking)
- 专题14: 手写一个loader,实现一个可选链(obj?.foo?.bar)
- 专题15: webpack性能优化2 (happypack、dllplugin、cache-loader)
- 专题16: webpack之多页面配置
- 专题17: 手写一个webpack插件
- 专题18: webpack 搭建 ssr
- 专题19: vue-next 项目搭建
- 专题20: vue3 响应式原理
- 合并两个有序数组为一个有序数组
- 浏览器跟node的 event loop 区别
- Webpack原理—编写Loader和Plugin
- TCP四次挥手
- 什么是CDN,对SEO优化有什么帮助
- js异步加载(defer、async、module)和预加载(preload、prefetch、subresource、prerender)前端文件
- 2019面经文
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from my-blog.