zoukankan      html  css  js  c++  java
  • 前端框架

    MV*

    view(呈现,模板,意图(事件,函数),更新(构造器))
    model(构造器来创建对象,包含service)

    模板技术

    • 字符串模板(%f,mustashe.js,handlebars.js)
    • dom模板(angularjs, 性能问题)
    • virtual dom(reactjs,内存中更新dom,然后比较,只修改变化的文件)

    库(dom的封装)

    • VUE.js(angular.js的简化版)
    • React.js
    • jQuery

    框架(基于需求面向问题)

    • angularjs
    • backbonejs

    包管理

    • CMD //后端js模块定义标准 commandjs nodejs
    • AMD //异步包,前端包定义标准 requirejs sea.js bower(前端包管理工具)

    js可以构建DSL

    JS

    • function

    typeof object is function
    typeof都返回function
    根(proto)都指向object

    函数的3种声明方式(1.直接声明 2.var fun=function(){} 3.new Function)
    函数的4种调用(1.直接调用 2.对象调用 3.call apply调用 4.new的时候构造器调用)

    tips:

     (function(window){
         var a=window.a //直接访问全局变量,不用先查找local变量,提升效率
      })(window);
    
    • object

    //职责(函数),协作(函数之间的调用),角色(面向对象添加的概念)包含职责
    //类,包,模块 都是代码的组织方式

    //封装:变化降到最低
    tips:

        return {//返回对象,用于封装
      hide:function(){} 
    }
    
    (function(){
       var a=1;//隔绝作用域
    })();
    

    this //指向调用者,而不是定义者

    var proxy=function(){//保证this指向正确的调用者
        Carestream.show.call(Carestream);
    }
    

    __proto__

    //所以的对象都有__proto__(查找链,继承链,不推荐直接操作,new的时候由prototype生成),function也是对象
    var o1={
    	method1:function(){}
    }
    var o2={
    	method2:function(){}
    }
    o2.__proto__=o1;//私有字段
    console.log(typeof o2.method1);//function
    console.log(typeof o2.method2);//function
    

    prototype

        //所以函数(构造器)都有prototype,是给new出来的对象用的,用于构建__proto__
    function Person(name){
    	this.name=name;//私有的信息
    	this.sayHello2=sayHello2;
    	this.sayHello3=sayHello3;
    	function sayHello2(){};
    }
    
    function sayHello3(){};
    
    Person.prototype.sayHello=function(){
    	console.log(this.name);//可继承的公共的
    };
    
    var o=new Person('jobs');
    
    //new Person('jobs')时的处理过程
    /*var o=new Object();
    o.__proto__=Person.prototype;
    Person.call(o,'jobs');//new Person()时this指向o*/
    o.sayHello();
    
    function sayHello1(){};
    var o1=new Person();
    var o2=new Person();
    console.log(o1.sayHello===o2.sayHello); //true
    console.log(o1.sayHello2===o2.sayHello2); //false,函数内部隔离新的作用域
    console.log(o1.sayHello3===o2.sayHello3); //true
    

    constructor

      //prototype都有constructor
    console.log(Person.prototype.constructor===Person); //true
    Person.prototype={
    	constructor:Person,//给prototype指定新对象时可以自己设定constructor
    	sayHello:function(){}
    }
    
    • 流行框架比较

    构造器调用(重用,字面量调用不需要重用) angular:字面量调用 backbone:构造器调用(new的时候调用)
    angular核心
    bindJQuery() //如果没有JQuery则创建JQLite
    publishExternalAPI() //setupModelLoader() 创建命名空间 var aa=window.aa || {};
    angular.module('demo',[])
    $scope=new scope

    //vue.js的实现
    function Class(obj){//类构造器,返回function
    	var fun=function(){};
    	for(var i in obj)
    	{
    		fun.prototype[i]=obj[i];
    	}
    	return fun;
    }
    var Person=new Class({
    	sayHello:function(){}
    });//创建一个类
    var jobs=new Person();
    jobs.sayHello();
    
    
    //jquery写插件
    ;(function(jQuery){
    	var extend=function(prop,options) {
    		for(var action in opotions){
    			prop[action]=optinos[action];
    		}
    	};
    	//fn即prototype
    	extend(jQuery.fn,{
    		myMethod: function(attribute){
    			
    		},
    	});
    })($);
    
    • 实现自己的框架

    扩展基本类型

        //Number扩展
    Number.prototype.after_sec=function(f){
    	f();
    };
    var i=5;
    i.after_sec(function(){
    	console.log('close.');
    });
    //Function扩展
    Function.prototype.method=function(name,fun){
    	this.prototype[name]=fun;
    	return this;//级联
    };
    function Person(name){
    	this.name=name;
    }
    Person.method('sayHello',function(){
    	return 'hello,'+this.name;
    }).method('show',function(){});
    var jobs=new Person('jobs');
    console.log('hello,jobs'==jobs.sayHello());
    

    实现类构造器

       //基于mocha测试框架
       //framwwork.js
    function Class(obj){//类构造器,返回function
    	var fun=function(){
    		if(typeof this.initialize==='function') //new的时候会执行,判断this(var o=new xxx()中的o)中有没有initialize
    			this.initialize.apply(this,arguments); //
    			//this.initialize(arguments[0]);//同上
    	};
    
    	for(var i in obj)
    	{
    		fun.prototype[i]=obj[i];
    	}
    
                //holy grail
    	fun.extend=function(op){
    		var ff=function(){};
    		//ff.prototype=this.prototype;//污染父类方法
    
    		//ff.prototype=new fun(); //会调用initialize
    
    		var F=function(){
    			this.constructor=ff;//给ff.prototype设置constructor
    		};
    		F.prototype=this.prototype;//extend方法只有fun来调用,this指向fun
    		ff.prototype=new F();//不会调用initialize
    		for(var i in op)
    		{
    			ff.prototype[i]=op[i];
    		}
    		ff.prototype.__super__=this.prototype;//任然可以调用父类的同名方法
    
    		return ff;
    	};
    
    	return fun;
    }
    
    module.exports={
    	createClass:Class
    };
    
    
    //test.js
    var assert=require('assert');
    var should=require('should');
    var Carestream=require('./framework');//加载当前目录下的framework.js
    //回归测试
    describe('this is a test',function(){
    	it('main class',function() {
    		var Person=new Carestream.createClass({
    			sayHello:function(){}
    		});//创建一个类
    		var jobs=new Person();
    		jobs.should.have.property('sayHello');
    	});
    
    	it('constructor',function() {
    		var Person=new Carestream.createClass({
    			initialize:function(name) {
    				this.name=name;
    			}
    		});//创建一个类
    		var jobs=new Person("jobs");
    		jobs.name.should.eql('jobs');
    	});
    	//
    	it('prototype',function() {
    		var Person=new Carestream.createClass({
    			sayHello:function(){}
    		});
    
    		var Customer=Person.extend({
    			myMethod:function(){}
    		});
    
    		var jobs=new Customer();
    
    		jobs.should.have.properties('sayHello','myMethod');
    	});
    
    });
  • 相关阅读:
    关于Sprte2d的图片切割
    关于U3d GameObject类型的可用描述
    [小巩u3d] Sprite 2D的资源占用分析
    [小巩u3d] 关于Raycast对BoxCollider和BoxCollider2d的碰撞监测规则
    Web服务器父与子 Apache和Tomcat区别
    [转]IIS添加MIME扩展类型及常用的MIME类型列表
    转载自知乎:程序员干到三十就干不动了」的说法是从哪来的?
    Unity之如何去除动画scale
    Unity shader学习之简单的水效果
    Unity shader学习之卡通渲染,轮廓线
  • 原文地址:https://www.cnblogs.com/yfann/p/4804111.html
Copyright © 2011-2022 走看看