JS模拟类继承

//最后一个参数是JSON表示的类定义

//如果参数大于一,则第一个参数是基类,否则,基类是object

//中间的参数是类实现的接口

//返回值是类,类是一个构造函数,并继承了基类的prototype


function Class(){

aDefine = arguments[arguments.length - 1]; //传入的最后一个参数是要定义的类

if(!aDefine) return; //如果没用传参数,则直接结束。

var aBase = arguments.length>1?arguments[0]:object; //如果传的参数大于1,则第一个参数为基类,若等于1,则基类默认为object

function prototype_(){}; //创建prototype临时函数,用以挂接原型链

prototype_.prototype = aBase.prototype;

var aPrototype = new prototype_(); //建立类要使用的原型对象

for(var member in aDefine){

if(aDefine[member] != ‘Create‘){ //构造函数不用挂在原型链上,构造函数是最终返回的

aPrototype[member] = aDefine[member];

}

}

//设置类

if(aDefine.Create){  //如果有构造函数

var aType = aDefine.Create; //类即为该构造函数

}else{ //如果没有构造函数

var aType = function(){ //创建默认的构造函数

this.base.apply(this, arguments); //调用父类的构造函数

}

}

aType.prototype = aPrototype;  //设置类(构造函数)的原型

aType.Base = aBase; //设置类型关系

aType.prototype.Type = aType; //为本类对象扩展一个Type属性,用以判断对象的类型

return aType; //将加了原型继承的构造函数返回,就可以new了

}

function object(){}; //定义object根类,用以实现最基础的方法和属性

object.prototype.isA = function(type){ //判断对象属性是否属于某种类型

var self = this.Type;

while(self){

if(self == type){

return true;

}

self = self.Base;

}

return false;

}

object.prototype.base = function(){   //调用基类的构造函数

var Caller = object.prototype.base.caller; //得到调用该函数的函数

Caller && Caller.Base && Caller.Base.apply(this, arguments);

//如果Caller存在并且 Caller.Base存在,则调用 Caller.Base方法

//若果如果Caller或Caller.Base有一个不存在,那么后面的语句不用再执行。

}

var people = Class({ //定义people类

Create: function(name, age){

this.base();

this.name = name;

this.age = age;

},

say: function(){

console.log(‘My name is ‘ + this.name + ",I‘m " + this.age + ‘.‘);

}

})

var chinaPeople = Class(people,

{

Create: function(name, age, country){

this.base(name, age);

this.country = country;

},

sayCountry: function(){

console.log(‘My country is ‘ + this.country);

}

}

)

var man1 = new people(‘kaka‘, 32);

var man2 = new chinaPeople(‘kaka‘, 32, ‘china‘);

man2.say();  //My name is kaka,I‘m 32.

man2.sayCountry();  //My country is china

caller不支持opera浏览器,所以重写base方法

object.prototype.base = function(){

var Base = this.Type.Base; //获取当前对象的基类

if(!Base.Base){ //如果已经没有基类

Base.apply(this, arguments); //直接调用基类构造函数

}else{

this.base = MakeBase(Base); //先复写this.base

Base.apply(this, arguments);

delete this.base; //删除复写的base属性

};

function MakeBase(Type){

var Base = Type.Base;

if(!Type.Base) return Base //基类已无基类,就无需包装

return function(){ //包装为引用临时变量Base的闭包函数

this.base = MakeBase(Base); //先复写this.base

Base.apply(this, arguments); //在调用基类构造函数

}

}

}

时间: 2024-08-04 13:27:32

JS模拟类继承的相关文章

js模拟类的创建以及继承

<html> <body> <script>    //js模拟类的创建以及继承        //第一步:创建父类        function Parent(name){            this.name = name;        }        //给父类添加属性方法        Parent.prototype.age = 18;        //var p1 = new Parent();    //第二步:创建子类            

js模拟类的继承

var object = {   //定义object基本类,用于实现最基础的方法和属性 isA: function(type){ var self = this; while(self){ if(self == type){ return true; } self = self.Type; }; return false; }, name: 'object' } function Class(baseClass, defineClass){ //创建类的函数,用于声明类及继承的关系 funct

js模拟类

ECMAScript6已经支持了class,但之前版本都不支持类,但是可以通过一些方法来模拟类. js中的类,既是重点,也是难点,很多时候都感觉模棱两可. 首先强调一下js中很重要的3个知识点:this.prototype.constructor. 下面我们来总结一下定义(模拟)类的几种方法: 1.工厂模式 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function createObject(name,age){   var obj = new Objec

JavaScript 高级篇之闭包、模拟类,继承(五)

本篇主要分享我对闭包的理解及使用闭包完成私有属性.模拟类.继承等,结合大量例子,希望大家能快速掌握!首先让我们先从一些基本的术语开始吧 一.javascript中的闭包 1.我们一起先来理解什么是函数的作用域. 2.调用的对象 结合例子: 复制代码 代码如下: function display(something) { function executeDisplay1() { document.write("我在帮老板打印:"+something+"<br />&

JS中“类”继承和原型继承

类继承: 先用函数构造器创建了一个“类”Student,然后在Student原型上定义了一个方法sayHello,然后创建了一个"类“PrimaryStudent,用apply()初始化PrimaryStudent. 然后让PrimaryStudent的原型等于Student创建的对象,并把PrimaryStudent原型上的构造器指向当前”类“,即PrimaryStudent,注意红色加粗部分. 1 function Student(name){ 2 this.name = name; 3 }

js模拟实现继承功能

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //js中模拟继承效果的案例 //函数对象中的三种“继承” 方式 汇总 //方式一 //****************************

JS 类继承 原型继承

参考文档:JS原型继承和类继承 <script src="jquery-2.0.3.js"> </script> <script> /*//类继承 var father=function(){ this.age=53; this.say=function(){ console.log("name:"+this.name+",age:"+this.age); } }; var child=function(){

JS面向对象组件 -- 继承的其他方式(类式继承、原型继承)

继承的其他形式: •类式继承:利用构造函数(类)继承的方式 •原型继承:借助原型来实现对象继承对象 类 : JS是没有类的概念的 , 把JS中的构造函数看做的类 要做属性和方法继承的时候,要分开继承. function Aaa(){ //父类 this.name = "小明"; } Aaa.prototype.showName = function(){ alert( this.name ); }; function Bbb(){ //子类 } Bbb.prototype = new

【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态

一.简介 Lua是一门非常强大.非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言.但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是一项庞大复杂的工程,如果没有面向对象功能势必会为开发带来一定的不便.不过幸好Lua中有table这样强大的数据结构,利用它再结合元表(metatable),我们便可以很方便地在Lua中模拟出类.继承和多态等面向对象编程具有的特性. 二.前提知识 按照惯例,我们还是先来熟悉一下必要的前提知识,以便方便