第一类工厂与哈希对象
来源:Ruby's Louvre 发布时间:2009-12-28 13:14:00
第一类工厂相当于mootools的Native方法,用于创建一些具有扩展能力的类,但这些类并没有继承能力,此类工厂也不能以某个类作为蓝本创建子类。总之,一切从简。第一类工厂要依赖一些辅助方法,一并写出来了。
var dom = {},//命名空间slice = Array.prototype.slice;dom.mixin = function (obj, bag) { if (arguments.length === 1) { bag = obj; obj = this; }; if (obj && bag && typeof bag === 'object') { for (var p in bag) { if(bag.hasOwnProperty(p)) obj[p] = bag[p]; } }; if (!+"\v1") {//IE不能在for...in循环中遍历toString与valueOf属性,需要单独处理 var t = bag.toString,v = bag.valueOf,op = Object.prototype; if (bag.hasOwnProperty("toString") && typeof t === "function" && t !== op.toString) obj.toString = t; if (bag.hasOwnProperty("valueOf") && typeof v === "function" && v !== op.valueOf) obj.valueOf = v; } return obj;};dom.factory = function(obj){//第一类工厂 var init = obj.init, klass = function() { if(arguments.length === 1 && arguments[0] instanceof klass) return arguments[0]; return new klass.fn.init(arguments); } klass.fn = klass.prototype = { init :init, constructor: klass }; klass.fn.init.prototype = klass.fn; delete obj.klass;delete obj.init; dom.mixin(klass.fn, obj); //用于扩展原型方法 klass.mixin = function(bag){ dom.mixin(this.fn,bag); return this; }; klass.alias = function(oldName, newName){ var bag = {}; if (dom.isString(oldName) && dom.isString(newName)){ var method = this.fn[oldName] if (!!method){ bag[newName] = method; return this.mixin(bag); }; }; //如果是一个属性包,如Hash.alias({keyOf: 'indexOf', hasValue: 'contains'}); bag = oldName; for (var name in bag) if(bag.hasOwnProperty(name)) this.alias(name,bag[name]); return this; }; klass.staticizeWithout = function(arr){ var conditions = {},keys = arr || [],me = this; for(var i=0,n = keys.length;i>n;i++){ conditions[keys[i]] = 1; } dom.each(me.fn,function(method, name){ if(!conditions[name] && dom.isFunction(me.fn[name]) && dom.isUndefined(me[name])&& name !== 'init' && name !== 'toString' && name !== 'valueOf' ){ me[name] = function () { var args = dom.toArray(arguments), caller = args.shift(); method.name = name; //为其泛化方法添加一个name属性 return method.apply(me(caller), args); } } }); return me; } return klass;};dom.mixin(new function(){ var _toString = Object.prototype.toString, _slice = Array.prototype.slice, _push = Array.prototype.push, is = function(obj,type) { return _toString.call(obj).match(/^\[object\s(.*)\]$/)[1] === type; } return { isArray: function (obj) { return is(obj,"Array"); }, isFunction: function (obj) { return is(obj,"Function") ; }, isNumber: function (obj) { return is(obj,"Number") ; }, isString: function (obj) { return is(obj,"String") ; }, isUndefined: function (obj) { return obj === void(0); }, each: function (obj, fn, bind) { for (var key in obj) //只遍历本地属性 if (obj.hasOwnProperty(key)) fn.call(bind, obj[key], key, obj); }, isArrayLike : function (obj) {//包括Array if(dom.isArray(obj) || obj.callee) return true; if(is(obj,'NodeList')) return true; if(is(obj,'HTMLCollection')) return true; //不能为字符串,不能为window,具有length属性 if(dom.isNumber(obj.length) && !dom.isString(obj) && !obj.eval){ if(obj.nextNode || obj.item) return true; var n = obj.length - 1 > 0 ? 0 : obj.length - 1 ; //如果是具有数字键或length属性的对象,如jQuery对象 if(obj.hasOwnProperty(n) && obj.hasOwnProperty(0)) return true return false; } return false; }, toArray : function (arr) { //把普通对象变成原生数组对象 if(arguments.length === 0 || arr === null){ return []; }else if(arr.callee){//如果是Arguments对象 return _slice.call(arr); }else if(dom.isArray(arr)){//如果Array对象返回一个克隆 return arr.concat(); }else if(dom.isArrayLike(arr)){ try{//jQuery对象,dom对象,el.getElementsByTagName得到的HTMLCollection //与el.childNodes得到的NodeList return _slice.call(arr); }catch(e){//IE用slice处理元素或节点集合会出错,只能慢慢拷贝 var ret = [], i = arr.length; while (i) ret[--i] = arr[i]; //Clone数组 return ret; } }else {//普通函数,单个元素节点,字符串,数字,window对象 return [arr]; } }, setArray: function (els) { //把普通对象变成类数组对象 this.length = 0; _push.apply(this, els); return this; } }});
这样dom就有如下几个方法mixin,factory,isArray,isArrayLike,isFuction,isNumber,isString,isUndefined,toArray,each,走实用主义路线,像isObject基本没有用。最新版的jQuery1.4a2好像加了两个特别的验证方法,isPlainObject(验证其是javascript core的Object而非宿主对象或DOM对象)与isEmptyObject(空对象,有点像{},但要保证其原型没有被扩展)。


猜你喜欢
- 下半年毕业季,各种毕业设计纷涌而至,虽然学校教了Python,但是我相信各位肯定没有认真学,做作业就懵逼的那种~所以我都给大家准备好了!各种
- 实现一个mysql数据库封装需要考虑的问题1.使用方便性采用直接sql语句操作方式。只要会写sql语句,那么将没有其他学习成本。uctphp
- 作为一个Oracle数据库开发者或者DBA,在实际工作中经常会遇到这样的问题:试图对库表中的某一列或几列创建唯一索引时,系统提示ORA-01
- 本文所示代码实现python编程方向键控制图片上下左右,我们首先看下演示结果。演示:实例代码:bif="1.jpg" m
- 安装tf2onnx以及onnxruntimepip install onnxruntimepip install tf2onnxtf 转为o
- 1.CNN概述CNN的整体思想,就是对图片进行下采样,让一个函数只学一个图的一部分,这样便得到少但是更有效的特征,最后通过全连接神经网络对结
- PIL中设计的几个基本概念1.通道(bands):即使图像的波段数,RGB图像,灰度图像以RGB图像为例:>>>from
- 引言“ 这是MySQL系列笔记的第十二篇,文章内容均为本人通过实践及查阅资料相关整理所得,可用作新手入门指南,
- 本文记录下自己使用Python实现一个简易的ORM模型使用到的知识1、元类2、描述器元类对于元类,我的理解其实也便较浅,大概是这个意思所有的
- PHP quotemeta() 函数实例在预定义的字符前添加反斜杠:<?php$str = "Hello world. (c
- 一、安装Docker安装环境:系统:CentOS Linux7 x86_64安装脚本wget -qO- https://get.docker
- 这个问题对于规模稍微大些的项目而言,显得尤其重要了,数据库中如果有几百个存储过程, 难道还一个个找不成,即使自己很了解业务和系统,时间长了,
- 以下是一些python的list和set的基本操作1. list的一些操作list = [1, 2, 3]list.append(5)pri
- 概述从今天开始, 小白我将带领大家一起来补充一下 数据库的知识.自连接自连接 (Self Join) 是一种特殊的表连接. 自连接指相互连接
- 前言from collections import namedtuple()命名元祖的工厂函数:在python中,collections 包
- 本文实例为大家分享了vue实现Input输入框模糊查询方法的具体代码,供大家参考,具体内容如下原理:原生js的indexOf() 方法,该方
- 本文为大家分享了购物商城小程序,供大家参考,具体内容如下软件版本:python3.x功能:实现简单购物商城1.允许用户选择购买多
- 1、概述 经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用。本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试。原图
- 这篇文章主要介绍了python使用enumerate获取迭代元素下标,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 单继承时super()和__init__()实现的功能是类似的class Base(object):def __init__(self):p