在面向对象编程中, 类 (class) 是对象 (object) 的模板, 定义了同一组对象共有的属性和方法. JavaScript 本身不支持类, 但是可以用一些变通的方法, 模拟出 "类".
1, 构造函数法
这是经典方法, 也是教科书必教的方法. 它用构造函数模拟 "类", 在其内部用 this 关键字指代实例对象.
- function Cat() {
- this.name = "大毛";
- }
生成实例的时候, 使用 new 关键字.
- var cat1 = new Cat();
- alert(cat1.name); // 大毛
类的属性和方法, 还可以定义在构造函数的 prototype 对象之上.
- Cat.prototype.makeSound = function(){
- alert("喵喵喵");
- }
2,Object.create()法
为了解决 "构造函数法" 的缺点, 更方便地生成对象, JavaScript 的国际标准 ECMAScript 第五版(目前通行的是第三版), 提出了一个新的方法 Object.create().
用这个方法,"类" 就是一个对象, 不是函数.
- var Cat = {
- name: "大毛",
- makeSound: function(){ alert("喵喵喵"); }
- };
然后, 直接用 Object.create()生成实例, 不需要用到 new.
- var cat1 = Object.create(Cat);
- alert(cat1.name); // 大毛
- cat1.makeSound(); // 喵喵喵
目前, 各大浏览器的最新版本 (包括 IE9) 都部署了这个方法. 如果遇到老式浏览器, 可以用下面的代码自行部署.
目前, 各大浏览器的最新版本 (包括 IE9) 都部署了这个方法. 如果遇到老式浏览器, 可以用下面的代码自行部署.
- if (!Object.create) {
- Object.create = function (o) {
- function F() {}
- F.prototype = o;
- return new F();
- };
- }
这种方法比 "构造函数法" 简单, 但是不能实现私有属性和私有方法, 实例对象之间也不能共享数据, 对 "类" 的模拟不够全面.
3, 极简主义法
荷兰程序员 Gabor de Mooij 提出了一种比 Object.create()更好的新方法, 他称这种方法为 "极简主义法"(minimalist approach).
封装
首先, 它也是用一个对象模拟 "类". 在这个类里面, 定义一个构造函数 createNew(), 用来生成实例.
然后, 在 createNew()里面, 定义一个实例对象, 把这个实例对象作为返回值.
使用的时候, 调用 createNew()方法, 就可以得到实例对象.
- var Person = {
- createNew: function() {
- var Person = {};
- Person.type = '人';
- Person.run = function() {
- console.log('我在跑');
- }
- return Person;
- }
- }
- var person1 = Person.createNew();
- person1.run(); // 我在跑
继承
让一个类继承另一个类, 实现起来很方便. 只要在前者的 createNew()方法中, 调用后者的 createNew()方法即可.
- var Male = {
- createNew: function() {
- var male = Person.createNew();
- male.type = '男';
- male.swim = function() {
- console.log('我在游泳');
- }
- return male;
- }
- }
- var male1 = Male.createNew();
- male1.swim();
私有属性和私有方法
在 createNew()方法中, 只要不是定义在 cat 对象上的方法和属性, 都是私有的.
- var Male = {
- createNew: function() {
- var male = Person.createNew();
- var swim = '我在游泳';
- male.doSwim = function() {
- console.log(swim);
- }
- return male;
- }
- }
- var male1 = Male.createNew();
- male1.doSwim();
- male1.swim; // undefined
数据共享
有时候, 我们需要所有实例对象, 能够读写同一项内部数据. 这个时候, 只要把这个内部数据, 封装在类对象的里面, createNew()方法的外面即可.
- var Male = {
- place: '南海',
- createNew: function() {
- var male = Person.createNew();
- male.doSwim = function() {
- console.log('我在' + Male.place + '游泳');
- }
- male.changePlace = function(place) {
- Male.place = place;
- }
- return male;
- }
- }
- var male1 = Male.createNew();
- male1.doSwim();
- var male2 = Male.createNew();
- male2.changePlace('北海');
- male1.doSwim();
来源: http://www.css88.com/qa/javascript/12167.html