【前端】Javascript MVC模式之我见

什么是MVC?

MVC是一种设计模式,即MODEL(模型)、VIEW(视图)、CONTROLLER(控制器)。

MVC模式让每一层做好一件事情,层与层之间保持松耦合,让代码更具可维护性。


问题:

如何划分MVC?

如何命名空间?在团队开发中,有可能会有命名冲突。

所以我们需要在window里面建立java中类似工程的东西,工程下面又有各个子项目


要实现:

简单方式实现对各子项目的MVC各模块装,取功能


实验1:

首先,我希望我的工程依托于我的工具

(function() {
    var Util = function() {};

    Util.prototype = {
	constructor : Util,
        // 创建工程和项目
        project : function(project, page) {
            this[project] = {};          // 工程
            this[project][page] = {};    // 子项目
        },
    }
	
    $$ = new Util();
}) ();
$$.project("VideoPlayer", "video");

console.log(window);

运行结果:

这样的结果是我们希望的。在VideoPlayer工程下有video项目


实验2:

除video外我还想建立一个Student,再调用这个函数会覆盖video,,所以  必须加判断!

将project方法中建立项目、工程代码改为如下:

if (this[project] == undefined) {
    this[project] = {};
}
if (this[project][page] == undefined) {
	this[project][page] = {}
}

这个时候就可以存在两个子项目了,这两个独立的项目应该有相同的内容

$$.project("VideoPlayer", "video");
$$.project("VideoPlayer", "student");

console.log(window);

运行:


实验3:

继续,当然我的每一个子项目都要包含MVC三个模块,所以,我需要在我每个子工程下建立三个类,所以代码更新至如下

(function() {
    var Util = function() {};

    var Mvc = function() {
        this.model = {};
        this.view = {};
        this.control = {};
    };

    Util.prototype = {
        constructor : Util,

        // 创建工程,创建项目
        project : function(project, page) {
            if (this[project] == undefined) {
                this[project] = {};
            }
            if (this[project][page] == undefined) {
                this[project][page] = new Mvc;
            }
        },
    };
    $$ = new Util();
}) ();
$$.project("VideoPlayer", "video");
$$.project("VideoPlayer", "student");

console.log(window);

结果如下:


实验4:

目前咱们只搭了个台子,往后还要给他们(MVC)加东西,因此,还需要装和取两种操作
在model里想加学生信息,而且要方便我以后取,因此要在model里加方法

当然,在实际使用这个工具的时候,咱们肯定是要在持续建类,为了方便建立,我们当然要能时刻定位当下目录

此时工具中还应给出在MVC各模块下增加类的方法

(function() {
    var Util = function() {
	    this.prt = Util.prototype;
    };

    var Mvc = function() {
	    this.model = {};
	    this.view = {};
	    this.control = {};
    };

    Util.prototype = {
	    constructor : Util,

	    currentPage : this,   //定位操作

	    // 创建工程,创建项目
	    project : function(project, page) {
	    	if (this[project] == undefined) {
	    		this[project] = {};
	    	}
	    	if (this[project][page] == undefined) {
	    		this[project][page] = new Mvc;
	    	}
			
	    	this.prt.currentPage = this[project][page];  
                //定位到当下目录
		//为什么不用this,对于左值,会先在当前对象成员里找,找不到则立刻建立
		// currenPage的作用,通过它可以知道当前处理的位置,相当于目录转换,类似与java包
	    },
	    model : function(className, Klass) {
	  	 this.prt.currentPage.model[className] = Klass;
		 var klass = this.prt.currentPage.model[className];
		 klass.obj = {};
		 // 建立对象
	    },
    };
    $$ = new Util();
}) ();
$$.project("VideoPlayer", "video");
$$.project("VideoPlayer", "student");

$$.model("StudentModel", function() {
 	this.name = '';
 	this.sex = true;
});

console.log(window);

运行结果: 

看,每个项目其原型空间中(prototype)都存在prt,他表示目前正在处理的位置,相当于目录转换,和java包异曲同工


实验5:

建立是有了,可取呢?

如果model函数中只传来一个参数,那我们就要执行取操作

有没有发现,这样越来越像Java了,可不可以在建立工程的时候把参数定成XXXX.XXXX.XXXX的形式,建立model的时候参数也定作这样,在工具中我们只用处理传来的字符串,建立工程和类

这样不就形成了java包的模式了

model : function (className, Klass) {
        if (arguments.length == 1) {
	    var index = className.indexOf(".");
    	    if (index == -1) {
	        return this.prt.currentPage.model[className];
	    }
	    var objName = className.substring(index+1);
	    className = className.substring(0, index);
	    return this.prt.currentPage.model[className][objName];
	}
	if (Klass instanceof Function) {
	    this.prt.currentPage.model[className] = Klass;
	    return Klass;
	}
	var classNames = className.split(".");
	className = classNames[0];
	var objName = classNames[1];
	this.prt.currentPage.model[className][objName] = Klass;
},

咱们只看model函数,当参数长度为1时,model用来获取model对象,若长度大于1,当然通过字符串路径添加model类了。


所有代码:

(function () {
	var Util = function () {
		this.prt = Util.prototype;
	};

	var Mvc = function () {
		this.model = {};
		this.view = {};
		this.action = {};
	};

	Util.prototype = {
		constructor : Util,
		currentPage : this,
		package : function (packageName) {
			var current = this;
			var packages = packageName.split(".");
			for (var index in packages) {
				var page = packages[index];
				if (current[page] == undefined) {
					current[page] = {};
				}
				current = current[page];
			}
			Mvc.call(current);
			this.prt.currentPage = current;
		},
		model : function (className, Klass) {
			if (arguments.length == 1) {
				var index = className.indexOf(".");
				if (index == -1) {
					return this.prt.currentPage.model[className];
				}
				var objName = className.substring(index+1);
				className = className.substring(0, index);
				return this.prt.currentPage.model[className][objName];
			}
			if (Klass instanceof Function) {
				this.prt.currentPage.model[className] = Klass;
				return Klass;
			}
			var classNames = className.split(".");
			className = classNames[0];
			var objName = classNames[1];
			this.prt.currentPage.model[className][objName] = Klass;
		},
	};

	$$ = new Util();
}) ();
$$.package("com.mec.video.core");
$$.package("com.mec.student");

$$.model("StudentModel", function (name, sex) {
 	this.name = name;
 	this.sex = sex;
});

var StudentModel = $$.model("StudentModel");
$$.model("StudentModel.student", new StudentModel("张三", true));

console.log(window);

运行结果:

总结:

这样运用,把js尽量往java上靠

看上图$$下有我们的整个工程,里面有包名称,包内有MVC,model里放所有类及其对象

对于view层,可以开始将html中带id的element拿出来形成键值对,装入view,不用每次查找再getElementById了(但对于一些后来添加的或更改的就必须要刷新view了,可以在get找不到标签的时候再刷新)

 

这样就构建了一个简单的前端MVC框架。

根据学习笔记,写出了这篇博文。若有问题,欢迎指教!

全部评论

相关推荐

02-12 20:22
重庆大学 Java
字节暑期刚入职四天,因为是年前,所以很多正职都放假走了,也就没有给我分配mt,然后有一个老哥在我来的时候给我发了一个landing手册,然后还有关于部门业务的白皮书,还有一些业务代码。然后本人是java面的,进来第一次接触go语言 前面几天熟悉了一下go的语法和go的框架,可以读但是还不太会写,然后业务白皮书也看的很头疼,包括landing手册里要了解的很多东西说实话我看文档真的快看死了,一个嵌套一个,问题是我还完全不知道咋用这个我了解的东西,还有就是那个项目代码,那个老哥喊我去写写单测,熟悉一下go的语法,但也进行的很困难(这是我第一段实习,之前都是springboot那一套,真不太熟悉这个)想问问大家的建议,就是我从现在开始到在开年回来之前应该做些什么,我目前就一个想法 就是复现一个landing手册上的go框架小项目 就是相当于帮自己锻炼锻炼怎么写go 或者各位大佬有没有更好的锻炼go语法的建议还有就是大家都在说vibe coding,那我应该怎么锻炼自己使用ai的能力,感觉我除了给一些需求然后它给我生成代码,好像就没别的用法了,那些什么工作流、拆解、skill啥的都不知道从哪一个地方开始,包括我现在正在实习,不知道精力该怎么分配,去网上想找找关于agent开发的一些学习流程,说实话,众说纷纭,有的是从python开始打基础然后系统学那些rag prompt langchain mcp等等,有的是说直接找一个github上的ai项目然后反复问ai,我确实有点迷茫,恳求各位大佬能留下你们宝贵的建议,我一定认真反复深刻学习有一说一 我觉得字节饭挺好吃的!
Jasonnnnnn...:直接把项目代码喂给AI然后让它帮你分析,如果组里已经有一些流程图总结的话最好,没有的话自己画一个 Go的话其实只要把基础语法搞明白就行了,项目里很多都是直接让ai帮你写好然后自己稍微改下,不用学的特别深 ai的话,可以自己写一些md文件来搞点小东西,但除非你打算转算法,否则不用把rag langchain学的特别深,了解下就行了
字节跳动公司福利 1371人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务