0%

Javascript的对象

Javascript的对象

在JS中也有对象,但是就是感觉怪异。他的对象看上去就是一个map

1
2
3
4
5
6
7
var bmiCalc = {
height : 1.80,
weight : 68,
bmi : function(){
console.log(this.weight/(this.height*this.height));
}
}

想想可能也对,一个对象最重要的不就是属性么?相同类的不同实例对象,不就是属性不同么。我感觉js的对象一定是后加上的特性,估计在最初设计这门语言时,其实并没有对象的这个概念,而是后来加上的。现在js的属性不仅仅可以是内置数据类型,比如整形,字符串,也还能是对象,甚至是函数。因为javascript里面有个匿名函数的概念,匿名函数就是一个函数,但是没有名字,我想可能就是一个指针,然后赋值给一个变量,然后通过变量加括号,来调用函数。也许想的不对,主要是关于开发一门语言所用的编译原理还是不能掌握,后面慢慢学。

接着说对象,如果一个js对象的某个属性是函数,那这个属性就成了方法,比如做个BMI测算。内部方法如果要使用属性(以前不都是叫成员变量么,妈的,世界为啥变化这么快)需要使用this,js里面的this还比较麻烦,他的this和java,C++这样的语言不一样,这篇文章深入浅出 JavaScript 中的 this讲的还不错。

对象的构造函数

用上述方式创建对象的问题在于,如果生成多个对象,只能每个都写一大堆的属性描述,而不能通过参数的方式创建一个类,代码很啰嗦,而且如果需要多加一个属性,那就更加麻烦了。于是js提供一种构造函数模式创建对象。

对象构造函数就是一个函数名开头大写的函数,然后通过new关键词生成的对象,而且再构造函数中this就会被绑定为此对象

1
2
3
4
5
6
7
8
9
10
11
12
13
function BmiCalc(height, weight){
this.height = height;
this.weight = weight;
this.bmi = function (){
console.log(this.weight/(this.height*this.height));
}
}
var pangzi = new BmiCalc(1.50, 80);
pangzi.bmi();
var shouzi = new BmiCalc(1.80, 60);
shouzi.bmi();
console.log(pangzi instanceof BmiCalc);
console.log(shouzi instanceof BmiCalc);

上面的脚本就生成了胖子瘦子两个对象,他们都是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