Javascript面向对象特性实现(封装、继承、接口)

Javascript作为弱类型语言,和Java、php等服务端脚本语言相比,拥有极强的灵活性。对于小型的web需求,在编写javascript时,可以选择面向过程的方式编程,显得高效;但在实际工作中,遇到的项目需求和框架较大的情况下,选择面向对象的方式编程显得尤其重要,Javascript原生语法中没有提供表述面向对象语言特性的关键字和语法(如extends、implement)。为了实现这些面向对象的特性,需要额外编写一些代码,如下。

在开始使用OO特性之前,还需要考虑使用接口、继承所带来的弊端。封装、接口、继承都将使代码结构变得复杂,对于编码新手有较高的要求,对于别人接受你的项目成本也提高了,在团队协作中需要根据具体需求斟酌,不要为了秀技术而写代码;同时,封装和接口都将带来一些额外的内存开销,有些可以忽略不计,有些 则是得不偿失,需要注意。

一、封装

var book = (function(){
var COUNT = 0; //静态私有方法
function checkISBN(isbn){
return true;
}
//构造器
var ctor = function(id,name,isbn){
var _id,_name,_isbn
this.setId= function(id){
_id=id;
}
this.getId = function(){
return _id;
}
this.setName = function(name){
_name = name;
}
this.getName = function(){
return name;
}
this.setIsbn = function(isbn){
_isbn = isbn;
}
this.getIsbn = function(){
return isbn;
}
if(checkISBN){
COUNT++;
}
this.setName(name);
this.setId(id);
this.setIsbn(isbn);
}
ctor.getCount = function(){
return COUNT;
}
return ctor;
})();
//静态、共用方法
book.buyCount = function(count){
return count;
} book.prototype = {
display:function(){
}
}
var b = new book();
b.getCount();
b.display();

二、接口

/**
* 接口:实现多个类的共同性。让彼此不想关的对象也能被同等对待。
*/ var Interface = function(name,method){
if(arguments.length < 2){
throw new Error("xxx");
}
this.name = name;
this.method = [];
for(var i = 0;i<method.length;i++){
if(typeof method[i] !== 'string'){
throw new Error("xxx");
}
this.method.push(method[i]);
}
}
//public static method
Interface.ensureImplement = function(object){
for(var i = 0;i<arguments.length;i++){
var interface = arguments[i];
if(Interface.construction !== Interface){
throw new Error("xxx");
}
for(var j = 0;j<ingerface.method.length;j++){
var method = interface.method[j];
if(!object[method] || typeof object[method] !==='function'){
throw new Error("xxx");
}
}
}
} var testResultInstance = new Interface("testResultInstance",["getData","getResults"]);
function testInterface = function(mapInstance){
Interface.ensureImplement(mapInstance,testResultInstance);
mapInstance.getData();
mapInstance.getResults();
}
function Map(name){
this.name = name;
this.getData = function(){};
this.getResults = function(){};
}
var mapInstance = new Map("test");
testInterface(mapInstance);

三、继承

/**
* 继承提供一些代码复用的功能。但继承照成两个类间的强耦合
*/
//类式继承
function Person(name){
this.name = name; }
function Design(name,book){
Person.call(this,name);
this.book = book;
}
extend(Person,Desion);
Design.prototype.getBooks = function(){
return this.book;
}
var d = new Design("tim","test");
d.getBooks();
d.name; function extend(superclass,subclass){
var F = function(){};
F.prototype = superclass.prototype;
subclass.prototype = new F();
subclass.prototype.constructor = subclass subclass.superclass = superclass;
if(superclass.prototype.constructor == Object.prototype.constructor){
superclass.prototype.constructor = superclass;
}
}
/********************************************************************/
//原型继承
function clone(superclass){
var F = function(){};
F.prototype = superclass;
return new F();
}
var Person = {
name:"default",
getName : function(){
return this.name;
}
};
var Desion = clone(Person);
Desion.books = ["写给大家看的设计书"];
Desion.getBooks = function(){
return this.books;
}
/********************************************************************/
//参元法
var Mimin = function(){};
Mimin.prototype = {
name : 'default',
getName : function(){
return this.name;
}
};
function augment(receiveingClass,givingClass){
for(methodName in givingClass){
if(!receiveingClass[methodName]){
receiveingClass[methodName] = methodName;
}
}
}

Javascript面向对象实现分页

<script type="text/javascript">
function Map() {
this.keys = new Array();
this.data = new Array();
//添加键值对
this.set = function (key, value) {
if (this.data[key] == null) {//如键不存在则身【键】数组添加键名
this.keys.push(key);
}
this.data[key] = value; //给键赋值
};
//获取键对应的值
this.get = function (key) {
return this.data[key];
};
//去除键值,(去除键数据中的键名及对应的值)
this.remove = function (key) {
this.keys.remove(key);
this.data[key] = null;
};
//判断键值元素是否为空
this.isEmpty = function () {
return this.keys.length == 0;
};
//获取键值元素大小
this.size = function () {
return this.keys.length;
};
} function dataGrid(obj) {
if (obj == null) {
return alert("请填入参数");
}
this.dataArray = new Map();
this.index = 0;
this.data = obj.data != null ? obj.data : "";
this.maxPage = 0;
this.pageNumber = 1;
this.pageSize = obj.pageSize != null ? obj.pageSize : 10;
this.pageToal = 0;
this.dataGrid = new Array();
} dataGrid.prototype.getDataGrid = function (index) {
this.dataGrid.splice(0, dataGrid.length);
var page = index * this.pageSize + this.pageSize;
if (this.pageToal - page > this.pageSize) {
page = page;
} else if (this.pageToal - page < this.pageSize && this.pageToal - page > 0) {
page = index * this.pageSize + (this.pageToal - page);
} else {
page = index * this.pageSize + this.pageToal;
}
for (var i = index * this.pageSize; i < page; i++) {
this.dataGrid[this.dataArray.keys[i]] = this.dataArray.data[this.dataArray.keys[i]];
}
} dataGrid.prototype.packageing = function (obj) {
var data = obj ? obj : this.data;
for (var items in data) {
this.dataArray.set(items, data[items]);
this.pageToal++;
}
this.maxPage = Math.ceil(this.pageToal / this.pageSize);
this.getDataGrid(this.index);
}
dataGrid.prototype.load = function () {
this.packageing();
return this.dataGrid;
} dataGrid.prototype.goit = function (index) {
if (index * this.pageSize > this.pageToal) {
return;
} else {
this.getDataGrid(index - 1);
}
return this.dataGrid; }
</script>

Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇的更多相关文章

  1. Javascript面向对象特性实现封装、继承、接口详细案例

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  2. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  3. .NET面向对象特性之封装

    .NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...

  4. (一)Javascript 面向对象编程:封装

    Javascript 面向对象编程:封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP ...

  5. PHP面向对象 实例化 构造函数 封装 继承 静态

    PHP面向对象 实例化 构造函数 封装 继承 静态 面向对象: 一:定义类 class Dog { var $name; var $age; var $pinzhong; function Jiao( ...

  6. Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)

    Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...

  7. Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态

    一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  8. python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态

    一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  9. javascript面向对象(一):封装

    本文来自阮一峰 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学 ...

随机推荐

  1. python学习3

    这部分学习python函数的写法: 在写python函数之前,首先看一下python中已经写好的函数,就像C中的<math>中的那些函数一样的东西有哪些:网址为https://docs.p ...

  2. [LeetCode] Find Median from Data Stream 找出数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  3. [LeetCode] Single Number II 单独的数字之二

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  4. .NET跨平台之旅:探秘 dotnet run 如何运行 .NET Core 应用程序

    自从用 dotnet run 成功运行第一个 "Hello world" .NET Core 应用程序后,一直有个好奇心:dotnet run 究竟是如何运行一个 .NET Cor ...

  5. 基于ionic+angulajs的混合开发实现地铁APP

    基于ionic+angulajs的混合开发实现地铁APP 注:本博文为博主原创,转载时请注明出处. 项目源码地址:https://github.com/zhangxy1035/SubwayMap 一. ...

  6. SQLSERVER单表CRUD通用方法

    一.适用场景 ①当你书写简单的增删改查心累了 ②当你的项目不考虑并发.高性能 ③当你追求更快速的开发效率 ④当你的业务只涉及单表 二.代码展示 ①单表Insert public bool Insert ...

  7. webfrom 总结

    网上看了很多理论,然而知易行难.在实际工作中还是存在很多问题. 下面是使用webform过程中的总结. 1.不使用服务端控件 表单有post和get两种方法,可以通过 form methed='pos ...

  8. table:设置边距,td内容过长用省略号代替

    table:设置边距,td内容过长用省略号代替 1.table:设置边距 合并表格边框border-collapse: collapse,然后用th,td的padding设置内容和边框之间的空隙pad ...

  9. JavaScript系列文章:详解正则表达式之二

    在上一篇文章中我们讲了正则表达式的基本用法,接下来博主想聊聊其中的细节,今天就从正则修饰符开始吧. 正则修饰符又称为正则标记(flags),它会对正则的匹配规则做限定,进而影响匹配的最终结果.在上次的 ...

  10. JavaScript系列文章:从let和const谈起

    注册博客园账号也有好些年了,有事没事经常来逛逛,感觉博客园的同学们一直都很活跃,相比国内其他社区来讲,这里的技术氛围很浓,非常适合学习和交流,所以博主我也决定在这里驻扎了,在这里,博主希望能坚持写一些 ...