发表于: 2017-04-10 21:23:31

1 1206


任务四

今天完成的事情

  1. 1整理一组组件的抽象设计。
  2. 2学习常用的构造函数设计模式。(根据js高程整理)
  3. 1 工厂模式

  4. 明天计划的事情

  1. 1.完善模态框组件。
  2. 2.任务四页面编写。

遇到的问题

如何进行一组组件的设计?

组件通常都是一组的,所以我们可以定义一个widget类,在这个类里面定义几个基本方法。

Widget.prototype ={
     on:function (type,handler) {
     },//注册事件
     fire:function (type,data) {
     },//触发事件
     off:function () {
     },//事件解绑
     renderUI:function () {
        
     },//dom节点添加
     bindUI:function () {
        
     },//dom事件绑定
     syncUI:function () {
        
     },//组件属性初始化
     destructor:function () {
        
     },//销毁前要执行的方法
     render:function (container) {
        this.renderUI();
        this.handlers={};
        this.bindUI();
        this.syncUI();
        $(container||document.body).append(this.boundingBox);
     },//组件添加
     destroy:function () {
        this.destructor();
        this.boundingBox.off();
        this.boundingBox.remove();
     }//组件销毁
  };

然后对于模态框组件,我们可以使用jquery继承widget这个类,然后再实现他定义的接口。定义好一组组件的方法和属性后,开始实现模态框。
对于模态框,为了方便调用,我们要尽可能的接近原生的alert调用方法。
所以我们定义一个Window类,这是一个Window类的构造函数:

function Window() {
     this.config = {};
     this.handlers={};
  }

然后开始在Window的原型中实现上述定义的接口与方法。
以最简单的销毁函数举例:

destructor:function () {
        this._mask&&this._mask.remove();
     }

实现了这些接口后,我们在开始实现alert方法

alert:function (config) {
        $.extend(this.config,config,{winType:"alert"});
        this.render();
        return this;
     }

销毁函数一般在放在关闭按钮的事件,点击关闭按钮,触发销毁方法。

收获

1.理解了抽象的好处。

2.学会了构造函数的一般写法。


创建对象

工厂模式

function Person(name) {
		var o=new Object();
		o.name=name;
		o.sayName=function() {
			console.log(this.name);
		}
	}

简单粗暴,但是浪费了大量的空间。并且这并不是一个构造函数,他在内部创建了一个对象赋值后返回了这个对象。而构造函数内部一般不会显示的创建对象,创建对象和返回对象一般由new命令完成。

构造函数

在使用构造函数之前,我们需要先理解new命令。对构造函数使用new命令后,后面的构造函数就不会正常执行了。
它的执行顺序会变成这样
1.创建一个空对象。
2.将空对象的原型指向构造函数的prototype属性。
3.将空对象赋值给this。
4.执行构造函数。
5.返回this对象(一般情况下)。
对于上面的代码写成构造函数就是

function Person(name) {
		this.name=name;
		this.sayName=function() {
			console.log(this.name);
		}
	}

原型模式

因为每个对象的方法都一样,对于一样的属性,我们完全可以放到原型对象中,每个对象都引用原型对象的方法就可以了,需要注意一点的是原型对象的写法。
构造函数

Person.prototype.sayName=function() {
		console.log(this.name);
	}

这种写法没有任何问题,但是如果重写整个原型对象,就会切断构造函数与最初原型之间的联系。如下面的代码所示:

Person.prototype={
		sayName:function () {
			console.log(this.name);
		}	
	};

这样写了以后constructor属性不再指向Person,constructor默认指向构造函数,被重写后会指向Object,所以使用对象字面量来重写整个原型对象的时候,要注意需要同时给constructor 赋值。不过不重新给constructor 赋值,也不会有大问题,只不过无法通过constructor 获取正确的对象类型,不过用instanceof可以解决。



返回列表 返回列表
评论

    分享到