JS原型实践 —— zepto
2019-03-31 本文已影响0人
zoneccc
zepto 是什么
可以先做一个简单的Demo,看看日常中使用的zepto是什么样的
<p>zepto test 1</p>
<p>zepto test 2</p>
<p>zepto test 3</p>
<div id="div1">zepto demo</div>
<script type="text/javascript" src="https://cdn.bootcss.com/zepto/1.2.0/zepto.js"></script>
<script type="text/javascript">
var $p = $("p")
$p.css("color", "red")
$p.html("it's p tag")
var $div1 = $("#div1")
$div1.css("background-color", "blue")
$div1.html("div1")
</script>
如果使用过jquery的朋友应该觉得熟悉,因为用法十分类似
zepto 的原型如何实现
我们看下zepto对象是在哪里创建的
// 空对象
var zepto = {}
// 这就是构造函数
function Z(dom, selector) {
var i, len = dom ? dom.length : 0
for (i = 0; i < len; i++) this[i] = dom[i] // 复制所有dom的属性
this.length = len
this.selector = selector || ''
}
zepto.Z = function(dom, selector) {
// 注意,出现了 new 关键字
return new Z(dom, selector)
}
zepto.init = function (selector) {
// 源码中,这了的处理情况比较复杂。但因为本次只是针对原型,因此这里就弱化了
var slice = Array.prototype.slice
var dom = slice.call(document.querySelectorAll(selector))
return zepto.Z(dom, selector)
}
// 即使用 zepto 时候的 $
var $ = function(selector){
return zepto.init(selector)
}
找到zepto的原型
$.fn = {
constructor: zepto.Z,
css: function (key, value) {
},
html: function (value) {
}
}
zepto.Z.prototype = Z.prototype = $.fn
构造函数Z
的原型的方法,是在$.fn
定义完了之后,又赋值给Z.prototype
的
另外,constructor
赋值了zepto.Z
而不是Z
,这是我不太理解的地方,不过完全不影响使用
zepto 看源码
一开始,是一个 umd 规范的封装
接下来
var Zepto = (function () {
var $ = function () {
}
// 返回核心函数
return $
})
// 暴露全局方法
window.Zepto = Zepto
window.$ === undefined && (window.$ = Zepto)
// 一些扩展,https://github.com/madrobby/zepto#zepto-modules 这些模块都是通过这种方式扩展的
;(function($) {
})(Zepto)
;(function($) {
})(Zepto)
;(function($) {
})(Zepto)