Javascript的对象
在JS中也有对象,但是就是感觉怪异。他的对象看上去就是一个map
1 | var bmiCalc = { |
想想可能也对,一个对象最重要的不就是属性么?相同类的不同实例对象,不就是属性不同么。我感觉js的对象一定是后加上的特性,估计在最初设计这门语言时,其实并没有对象的这个概念,而是后来加上的。现在js的属性不仅仅可以是内置数据类型,比如整形,字符串,也还能是对象,甚至是函数。因为javascript里面有个匿名函数的概念,匿名函数就是一个函数,但是没有名字,我想可能就是一个指针,然后赋值给一个变量,然后通过变量加括号,来调用函数。也许想的不对,主要是关于开发一门语言所用的编译原理还是不能掌握,后面慢慢学。
接着说对象,如果一个js对象的某个属性是函数,那这个属性就成了方法,比如做个BMI测算。内部方法如果要使用属性(以前不都是叫成员变量么,妈的,世界为啥变化这么快)需要使用this,js里面的this还比较麻烦,他的this和java,C++这样的语言不一样,这篇文章深入浅出 JavaScript 中的 this讲的还不错。
对象的构造函数
用上述方式创建对象的问题在于,如果生成多个对象,只能每个都写一大堆的属性描述,而不能通过参数的方式创建一个类,代码很啰嗦,而且如果需要多加一个属性,那就更加麻烦了。于是js提供一种构造函数模式创建对象。
对象构造函数就是一个函数名开头大写的函数,然后通过new
关键词生成的对象,而且再构造函数中this就会被绑定为此对象
1 | function BmiCalc(height, weight){ |
上面的脚本就生成了胖子
和瘦子
两个对象,他们都是BmiCalc的实例。so far, js已经可以支持面向对象了,但实际上javascript和传统的面向对象语言C++和Java并不一样,他是通过一种prototype-base的方式实现的面向对象。
Prototypes
什么是prototypes呢?就是每个js的对象都有一个指针,指向一个对象,这个对象假装自己是当前这个对象的父类,prototype所指向的对象的方法和属性,是被所有实例共享的。我说的不清楚,这篇人家2011年写的blog还算简单易懂Understanding “Prototypes” in JavaScript。
给人的感觉就是,javascript里面的类定义好随意,可以随便新增属性或方法,以前设计一个类,里面的成员变量,方法都是要经过认真思考的,可在js里面,好像怎么整都行。
一种常见的对象定义模式是,在构造器(函数体)中定义属性、在 prototype
属性上定义方法。
还是没有把js对的OO机制完全理解,只是能够明白怎么去创建一个类,new一个实例,知道大概是通过原型链实现的继承和共享封装。以后再体会吧,眼前够用就好了。
参考文档:
http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes