实现一个简单的jQuery API

一、先封装函数
1.获取节点所有的兄弟节点:
function getSiblings(node){
var allChildren = node.parentNode.children

var array = {
length : 0
}

for(let i = 0;i < allChildren.length;i++){
if(allChildren[i] !== node){
array[length] = allChildren[i]
array.length += 1
}
}

return array
}

2.给一个标签添加多个样式类名
function addClass(node,classes){
classes.forEach((value) => {node.classList.add(value)})
}

二、创建一个命名空间
var dom = {}
dom.getSiblings = function(node){
var allChildren = node.parentNode.children

var array = {
length : 0
}

for(let i = 0;i < allChildren.length;i++){
if(allChildren[i] !== node){
array[length] = allChildren[i]
array.length += 1
}
}

return array
}

dom.addClass = function(node,classes){
classes.forEach((value) => {node.classList.add(value)})
}

三、将参数 node 放到最前面
i. 扩展 Node 对象接口
直接在 Node 对象上添加封装函数,修改Node.protorype对象,在Node.prototype对象上新增方法。 缺点: 修改 Node 对象的原型,可能无意识覆盖原生API

ii. 创建一个新的接口 (其实就是jQuery)

function jQuery(nodeOrString){
let nodes = {}

// 通过类型检测,获得正确的节点,添加进 nodes 对象
if( typeof nodeOrString === 'string' ){
let temp = document.querySelectorAll(nodeOrString)
for(let i = 0;i < temp.length;i++){
nodes[i] = temp[i]
}
nodes.length = temp.length
} else if(nodeOrString instanceof Node) {
nodes[i] = nodeOrString
}

return {
getSiblings : function(){
// 操作 nodes(闭包)
},
addClass : function(){
// 操作 nodes(闭包)
},
...
}
}
这种方法的优点是「无侵入」。jQuery构造函数生成一个新的对象,并给对象封装方法,不会修改节点上的原生Node对象。

四、用window.$ = jQuery 缩写之后,就可以使用 $() 代替 jQuery() 了。
let $xxx = $()

posted @ 2018-07-18 00:13  captainxue  阅读(54)  评论(0)    收藏  举报