`

使用Base简化JavaScript继承

 
阅读更多

     习惯了Java这种“正统”的面向对象的编程方式,在使用Javascript的基于原型的继承的方式变多少觉得有些别扭,有这种感觉的人应该不少,所以也有了各种继承的解决方法,今天我们介绍的这个是dean.edwards大牛的Base库。

    先看下作者当时创作Base的目的,以下翻译自作者的博客:

  • 我希望可以摆脱prototype的方式,以更加简单的方式创建Class
  • 我希望可以在子类复写的方法里,直接访问被复写的父类方法,像java的super
  • 我希望避免在原型阶段调用类构造函数
  • 我希望可以简单地添加静态(类的)方法和属性
  • 我希望可以不借助在全局函数建立原型链来实现以上目标
  • 我希望可以在不影响Object.prototype的情况下实现以上目标

   简化Javascript的OO使用方式Base横空出世,她简洁、优雅,而使用方式却非常简单,Base主要提供了两个实例方法和一个静态方法,下面我们详细讨论Base的使用方法。以下内容主要来自于翻译作者博客的内容。

   主要从以下几个方面介绍:

  1. 创建类
  2. 静态方法和属性
  3. 私有属性
  4. 实现单例

  1、使用Base创建类  

   使用Base创建类主要使用Base的静态方法extend,我们来看下具体的代码:

   

var Shape = Base.extend({
  constructor:function(name){
     this.name = name;
  },
  
  draw:function(){ 
    console.log(this.name + "draw");
  },

  erase:function(){
     console.log(this.name + 'erased');
  },

  setColor:function(color){
    this.color = color;
  }

});

   这样我们就有了一个Shape类,通过constructor定义对象的构造函数,有了这个Shape类之后我们就可以创建对象的实例了:

  

var shape1 = new Shape('shape1');

    使用这种方式,对我们这种骨子里的OO人(也就是作者说的OO programmer at heart)来说,比起使用Function来定义类感觉舒服多了~~,接下来我们看下继承:

    

var Circle = Shape.extend({
   constructor:function(name){
      this.base(name);
   },
  
   draw:function(){
      console.log('Circle ' + this.name + ' draw ' );
   }

});

   这儿我们通过继承Shape创建了一个子类Circle,并复写了父类的draw方法,在这儿有两个需要注意的地方:

  •    一是我们直接调用的是Shape的extend方法
  • 在构造函数中,我们调用了this.base来调用父类的构造函数,当然base方法可以出现在任何复写后的方法中使用,用来调用被复写的方法

  2、添加静态方法和属性

  使用Base添加静态方法和属性非常简单,extend方法可以接收两个参数,第一个参数定义的是实例方法和属性,第二参数就是用来定义静态方法和属性的,我们来看下具体的代码,我们为Shape添加一个静态属性:

var Shape = Base.extend({
  constructor:function(name){
     this.name = name;
  },
  
  draw:function(){ 
    console.log(this.name + "draw");
  },

  erase:function(){
     console.log(this.name + 'erased');
  },

  setColor:function(color){
    this.color = color;
  }

},{
  PI : 3.14
});

 

  这样就为Shape类添加了一个静态属性,可以直接使用Shape.PI进行访问。

  3、私有属性

  下面我们来看下如何使用Base实现私有属性的访问,看下实例代码,一般你可以使用如下方式:

  

function Circle(radius) {
	this.getCircumference = function() {
		return 2 * Math.PI * radius;
	};
};

   但是也可以使用Base实现:

  

var Circle = Shape.extend({
	constructor: function(radius) {
		this.extend({
			getCircumference: function() {
				return 2 * Math.PI * radius;
			}
		});
	}
});

 

  4、单例模式

  使用Base实现单例方式非常简单,只需要将构造函数定义为null就可以了,代码如下:

  

var Math = Base.extend({
	constructor: null,
	PI: 3.14,
	sqr: function(number) {
		return number * number;
	}
});

 

 最后是base方法使用的一些注意事项:

  1、如果你定义名称为init的类方法(不是一个实例方法),在创建类时会自动调用

 2、在原型阶段构造函数不会被调用

 

分享到:
评论

相关推荐

    js继承 Base类的源码解析

    `Base`类在JavaScript中被广泛使用,作为一个优秀的继承封装,它简化了对象间的继承关系。这里我们将深入解析`Base`类的部分源码,了解它是如何实现继承功能的。 首先,`Base`类本身就是一个构造函数,它的主要目的...

    Base.js 库 实现 JS 的对象化编程

    Base.js 是一个JavaScript库,它主要的目标是帮助开发者实现更面向对象的编程风格。...通过学习和使用Base.js,开发者可以更好地利用JavaScript的面向对象特性,写出更优雅、更易于理解和扩展的代码。

    JavaScript核心及实践

    - **8.3工具包Base**: 可以创建一个基础的工具包来简化常用的代码模式。 #### 函数式的JavaScript - **9.1匿名函数**: 没有具体名称的函数,通常用于临时任务或回调函数。 - **9.2高阶函数**: 接受函数作为参数或...

    new-base-class:使用基类扩展!

    这是一个简单的模块,提供了一个简单的 Class 函数来简化 JavaScript 中的类定义。 支持 getter/setter。 易于使用,易于继承/扩展。 还支持从Array 、 Error或 Node.js events.EventEmitter继承。 没有难的...

    廖雪峰javascript,python和git教程

    - jQuery:一个快速、小巧的JavaScript库,简化了HTML文档遍历、事件处理、动画和Ajax交互。 #### Node.js - Node.js安装和第一个Node程序的编写。 - Node.js模块的使用,例如fs、http和stream模块。 ### Python...

    wc-base:JavaScript Web组件自定义元素基类,该类自动导入组件的样式表并在自定义元素浏览器注册表中对其进行定义

    wc-base简化了这一流程,开发者只需要专注于业务逻辑,而无需关注基础设置。 wc-base的一个关键功能是自动导入组件的样式表。在Web Components中,为了保持组件的封装性和防止样式污染全局,通常会使用Shadow DOM来...

    Classify.js:用于经典对象继承的 JavaScript 库

    **JavaScript经典对象继承** 在JavaScript中,对象继承是面向对象编程的一个核心概念,它允许创建新的...它简化了JavaScript的面向对象编程,同时引入了一些在原生语言中缺乏的功能,提高了代码的可维护性和可读性。

    base-class-extend:BaseClass实用程序

    这个简单的模块提供了一个简单的Class函数,以简化JavaScript中的类定义。 支持getter / setter。 易于使用,易于继承/扩展。 还支持从Array , Error或Node.js events.EventEmitter继承。 没有困难的关键字, ...

    Extjs中使用extend(js继承) 的代码

    在Ext JS框架中,Ext.extend是用来实现JavaScript继承的一种方法。Ext JS是一个用于开发富交互式的Web应用程序的框架,它封装了复杂的DOM操作,提供了一套丰富的UI组件。在使用Ext JS开发时,使用Ext.extend可以创建...

    解开Ajax技术生命的达芬奇密码.pdf

    2. **使用ES6的类和`super`关键字**:在ES6及更高版本中,可以通过类和`super`关键字来简化面向对象编程的实现。 ```javascript class BaseClass { constructor() { this.name = "BaseClass"; } getName()...

    廖雪峰 JavaScript Python Git 教程-01151355.pdf

    - **jQuery**: 一个流行的 JavaScript 库,简化 HTML 文档遍历、事件处理等。 - **underscore**: 提供实用函数的 JavaScript 库。 - **Node.js**: 服务器端 JavaScript 运行环境。 - **模块**: Node.js 的模块系统。...

    javascript面向对象创建对象的方式小结.docx

    除了上述原生JavaScript的方法外,还可以借助于第三方库如Base2.js和SimpleJavaScriptInheritance.js等来简化对象的创建过程。这些库提供了更高级的OOP功能,如继承、封装等。 #### 九、总结 不同的创建对象方式...

    laravel5.1框架基础之Blade模板继承简单使用方法分析

    在 Laravel 框架中,Blade ...总的来说,Laravel 5.1 中的 Blade 模板继承简化了大型项目中的视图管理,提高了代码的可读性和可维护性。通过合理地组织和利用模板继承,开发者可以更高效地构建复杂且一致的用户界面。

    Laravel开发-laravel-base

    - 特性包括条件判断、循环、部分视图、继承和组件。 在“laravel-base”项目中,开发者可能已经实现了这些基础功能,并根据需求进行了扩展。通过深入理解这些核心概念,你可以更好地维护和扩展这个项目,使其成为...

    Laravel开发-project-base-laravel

    总结来说,"Project Base Laravel" 是一个为 Laravel 开发者准备的起点,它简化了项目的初始化过程,让开发者能够更快地专注于业务逻辑的实现,而不是基础架构的搭建。通过深入理解和使用这个项目模板,开发者可以更...

    prototype经典

    Prototype是一个开源的JavaScript库,它的目标是简化JavaScript的开发,提供了一套丰富的DOM操作API,以及面向对象编程的支持。它通过增强原生JavaScript对象和引入新的设计模式,如模块模式和装饰者模式,提高了...

    jsclass:一些有用的 javascript 类库

    在JavaScript中,由于没有原生的类支持,Base类库经常通过原型链来实现类的继承和方法的封装。 2. **原型(Prototype)**: JavaScript中的原型是实现面向对象编程的关键机制。每个JavaScript对象都有一个内部链接到另...

    (知识引用自)廖雪峰-JavaScript-Python-Git-教程-by-it-ebooks-_z-lib.org_1

    22. **jQuery**:一个广泛使用的JavaScript库,简化DOM操作和事件处理。 Python 2.7教程: Python是一种高级编程语言,以其简洁的语法和强大的功能闻名。主要知识点包括: 1. **Python简介**:Python易于学习,...

    Extend

    在JavaScript中,对象扩展可以通过多种方式实现,如使用原型链(__proto__),Object.create(),ES6的类继承(class extends)以及使用Object.assign()等方法。 - **原型链**:通过修改对象的原型(__proto__)...

Global site tag (gtag.js) - Google Analytics