最新学习了《Professional JavaScript for Web Developers》第二版。终于对JavaScript中的面向对象特性有了一定的认识。
这篇文章主要是自己的一些心得体会,可能有错误的地方,还望多多指点。
其实JS和我们平时的OO语言(C++,Java,PHP等等)有很大的区别,从本质上来说
JS是一种面向函数的语言,函数在JS中的地位是很高的,可以说是一级公民。在Java等传统的OO语言中,类才是一级公民。把这一点搞清楚,才能对JS有深入的了解。
在JS中,其实没有类的概念。只有原型的概念,
原型是什么了?我还没有搞清楚。可以将原型理解为对象,JS中的面向对象的特性(抽象、封装、继承、多态)其实是在对象的范畴中实现的。由于没有类的概念,所以在实例化一个对象时,是通过对象的原型来实现的。代码如下:
- function Person(){
-
this.name = "tom";
-
this.age = 12;
-
}
-
-
var instance = new Person();
上面的代码实例化了一个Person对象,可以看到,“声明原型”(自创的术语:()使用的是函数,也可以认为
声明一个类的过程就是声明一个构造函数的过程。在JS中,当创建一个函数时(一般情况首字母大写,可以看作是一个原型的申明),系统(指JS解析器)会为之创建一个原型,函数的prototype属性指向系统创建的原型。在实例化一个对象时,系统会为对象添加__proto__属性,这个属性指向系统创建的原型。示意图如下:
在JS中,实现继承的机制是原型链,比如如下的代码:
- function Person(){
-
this.name = "tom";
-
this.age = 12;
-
}
-
function ChildPerson(){
-
this.toy = "duck";
-
}
-
//实现继承
-
ChildPerson.prototype = new Person();
-
var childInstance = new ChildPerson();
-
var instance = new Person();
上面的代码可以如下图解释:
按照这种继承方式,就可以明白JS内部对象其实都是继承自Object的原型了。由于Object的原型含有toString,toLocalString,valueOf等方法,所以每个内部对象和自定义对象都是具有这些方法的。
阅读(464) | 评论(0) | 转发(0) |