类继承与原型继承
来源:互联网 发布:clint eastwood 知乎 编辑:程序博客网 时间:2024/05/17 04:06
今天在做WebGL的封装,再加上看到贴吧一些帖子突然想到这个问题。原型继承是JavaScript最变态的地方了,但是为什么它一直都使用原型继承而不用类继承呢?我就想不明白原型继承哪里不好了,为什么很多开发者非要用JavaScript去生硬的模拟类继承呢?
首先来讨论个问题。类继承和原型继承到底哪个比较先进!?也不能说先进吧,是高级编程语言先进还是低级编程语言先进这个问题也说不太清楚。咱就抛开“先进”换个词,用不带褒贬含义的“高级”来描述。我个人觉得JavaScript原型继承是比普通的类继承高级的。
类继承的逻辑有点像神创造世界。先定义概念上的类,再对这个类实例化得到对象。对于逻辑来说这就非常底层,因为它是直接对整个概念的定义。就像神说要有光就有了光,光就这样不明不白的有了,谁来负责?不过确实类继承的各种功能强大,基本原型继承能实现的它也都能实现。但是它很麻烦,至少和原型继承比起来它是麻烦的。
原型继承的本质实际上是在复制已经存在的对象。也就是复制构造器的prototype对象,构造器本身只是提供一个类似类继承中构造函数的功能。JavaScript这样的脚本语言和原型继承简直是天造地设的一对!因为JavaScript的对象以哈希形式储存,所以很容易在对象上定义属性方法,也很容易复制对象。而且使用原型继承做出的封装并不比类继承差。
其实,如果排除掉哈希对象本身的性能损耗,原型继承绝对比类继承更有优势。但如果不用哈希对象,而直接使用强类型的结构体做原型继承,那它就一点价值都没有。类继承也一样,如果它失去了性能方面方面的优势,那就不值一提了。所以,很多人也许是Java写多了,非要把类继承的概念强加到JavaScript上,在JavaScript上模拟类继承。我觉得这种做法干脆用JavaScript模拟个Java算了= =。
不过有时类继承的一些思想我们可以利用,比如多级继承。原型继承的思想本身只是克隆对象,没有多级继承的概念。但是我们完全可以使用原型继承和脚本语言的特性结合来做出比类继承更优秀的封装。学习要学精髓,不是一味的模拟。总之,就脚本语言和原型继承完全可以做出比类继承更优秀的封装。
首先来讨论个问题。类继承和原型继承到底哪个比较先进!?也不能说先进吧,是高级编程语言先进还是低级编程语言先进这个问题也说不太清楚。咱就抛开“先进”换个词,用不带褒贬含义的“高级”来描述。我个人觉得JavaScript原型继承是比普通的类继承高级的。
类继承的逻辑有点像神创造世界。先定义概念上的类,再对这个类实例化得到对象。对于逻辑来说这就非常底层,因为它是直接对整个概念的定义。就像神说要有光就有了光,光就这样不明不白的有了,谁来负责?不过确实类继承的各种功能强大,基本原型继承能实现的它也都能实现。但是它很麻烦,至少和原型继承比起来它是麻烦的。
原型继承的本质实际上是在复制已经存在的对象。也就是复制构造器的prototype对象,构造器本身只是提供一个类似类继承中构造函数的功能。JavaScript这样的脚本语言和原型继承简直是天造地设的一对!因为JavaScript的对象以哈希形式储存,所以很容易在对象上定义属性方法,也很容易复制对象。而且使用原型继承做出的封装并不比类继承差。
其实,如果排除掉哈希对象本身的性能损耗,原型继承绝对比类继承更有优势。但如果不用哈希对象,而直接使用强类型的结构体做原型继承,那它就一点价值都没有。类继承也一样,如果它失去了性能方面方面的优势,那就不值一提了。所以,很多人也许是Java写多了,非要把类继承的概念强加到JavaScript上,在JavaScript上模拟类继承。我觉得这种做法干脆用JavaScript模拟个Java算了= =。
不过有时类继承的一些思想我们可以利用,比如多级继承。原型继承的思想本身只是克隆对象,没有多级继承的概念。但是我们完全可以使用原型继承和脚本语言的特性结合来做出比类继承更优秀的封装。学习要学精髓,不是一味的模拟。总之,就脚本语言和原型继承完全可以做出比类继承更优秀的封装。
0 0
- 类继承与原型继承
- javascript 类式继承与原型继承
- 继承与原型链
- 原型对象与继承
- JavaScript原型与继承
- 原型与继承
- 原型链与继承
- 原型与继承
- 继承与原型链
- JavaScript原型与继承
- 继承与原型链
- 继承与原型链
- 原型与继承
- 原型与继承
- 原型与继承
- 继承与原型链
- [Javascript] 继承 (原型继承, 类继承)
- javascript 继承与原型继承用法详解
- iOS 17个常用代码整理
- LitePal学习总结 (五)
- php优化的小细节2
- 对二分查找程序的一次测试
- Linux进程同步之POSIX信号量
- 类继承与原型继承
- C#设置默认打印机-COM和WMI二种方式
- linux下纯C++读取参数配置文件
- javascript下获取guid或者UTC时间作为唯一值
- 节约用水
- cv::Mat和CvMat的区别及相互转化
- JDK扫盲
- windowmanger的addview,removeView方法出现的异常
- 修改eclipse的默认编码方式