javascript发展至今,大多数浏览器已支持ES2015标准的class类型定义语法:
"use strict";//要求严格模式
class name [extends] {
constructor:...
prop1:...
method1:...
}
//或者:
const name = class [className] [extends] {
...
}
在不支持class类型的浏览器中,或者为了兼容非严格模式下已在使用的功能,自己动手制作一个定义类、继承类的功能(支持IE9以上及其他各类主流浏览器),可继承传统方式定义的类型,也可继承系统预定义类型:
资源链接:CSDN下载:Javascript编程 类的继承及封装:Class
使用示例:
一、定义基类及继承:
var A = Class({ //基类
constructor: function (a) { //构造函数,可无
this.a = a;
},
add: function (n) { //定义方法及属性
this.a += n;
},
dec: function (n) { //定义方法及属性
this.a -= n;
}
});
var B = Class({ //继承
extends: A, //继承自
constructor: function (a) {
this.super(a * a); //调用基类的构造函数
},
add: function (n) { //重载方法
A.prototype.add.call(this, n * n); //调用被重载的基类方法
}
});
//测试及结果:
var b = new B(2);
b.add(2); //调用重载的方法
b.dec(2); //调用继承自基类的方法
console.log(b); //{a: 6}
console.log(b instanceof A); //true
二、继承传统方式定义的类型:
function A(a) { //传统方式定义类型
this.a = a;
}
A.prototype.add = function (n) { //方法
this.a += n;
}
A.prototype.dec = function (n) {
this.a -= n;
}
var B = Class({ //继承
...(以下同“一、定义基类及继承”中的代码)
三、继承系统预定义类型,以Array举例:
var C = Class({
extends: Array, //继承系统预定义类
constructor: function () {
var a = Array.apply(this, arguments);//此为兼容IE9,其他浏览器也可改为:Array(...arguments)
for (var i = 0; i < a.length; i++) this.push(a[i]);//原因同上:a.forEach(it=>this.push(it))
},
push: function (v) {
Array.prototype.push.call(this, "@" + v);
},
});
//测试及结果:
var c = new C("A", "B");
c.push("C");
console.log(c); //['@A', '@B', '@C']
console.log(c instanceof Array); //true
console.log(c instanceof C); //true
通过以上代码及使用示例,可以看到在javascript中定义及继承类已非常地简单。同时,在此基础上,您也可以轻易扩展其能力。
比如,通过将代码中的assign函数做以下修改:
function assign(s, t) {
Object.getOwnPropertyNames(s).forEach(function (p) {
if (p !== 'extends' && p !== 'constructor') {
var isDesc = typeof s[p] === "object";
//一般类型定义中不要使用对象(包括数组)作为属性,否则会出现共享冲突。
//所以这里使用“typeof... === "object"”做简单判断
Object.defineProperty(t, p, isDesc ? s[p] : Object.getOwnPropertyDescriptor(s, p));
}
});
}
我们就可以在定义属性时,直接使用Object.defineProperty定义属性时的get、set、writable等能力。
示例:
var A = Class({
constructor: function (a) {
this.a = a;
},
b:{
get: function(){
return "result: "+this.a;
}
}
});
//测试及结果:
var a = new A(2);
console.log(a); //{a: 2, b: "result: 2"}
结语:javascript作为一门浏览器语言,是有不可替代的使用价值及研究价值的。在追求模块化、对象化编程的今天,javascript是可以胜任的。作者积累多年的前后端开发经验,愿与您一起研究和分享。