js原型在jQuery和zepto中的使用

原型的实际应用

zepto库中实现原型的方式:

index.hmtl代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <P>jquery test 1</P>
    <P>jquery test 2</P>
    <P>jquery test 3</P>
    <div id="div1">jquery test in div</div>
</body>
<script src="my-zepto.js"></script>
<script type="text/javascript">
	//初始化实例
    var $p = $('p');
    $p.css('color', 'red');
    console.log($p.html());
    
	//初始化实例
    var $div1 = $('#div1');
    $div1.css('color', 'blue')
    console.log($div1.html());
</script>
</html>

my-zepto.js代码:

//定义一个自执行函数,避免全局变量的污染
(function (window) {
    var zepto = {};
    //Z构造函数
    function Z(dom, selector) {
        var i, len = dom ? dom.length : 0;
        for (i = 0; i < len; i++) {
            this[i] = dom[i];
        }
        this.length = len;
        this.selector = selector || '';
    }

    zepto.Z = function (dom, selector) {
        return new Z(dom, selector);
    }

    zepto.init = function (selector) {
        //document.querySelectorAll获取的是类数组,通过数组的slice方法将类数组转化成真正的数组
        var slice = Array.prototype.slice;
        var dom = slice.call(document.querySelectorAll(selector));
        return zepto.Z(dom, selector);
    }

    //定义一个$函数
    var $ = function (selector) {
        return zepto.init(selector);
    }
    //将定义的$函数挂到全局变量window中
    window.$ = $;
    $.fn = {
        css:function(key,value){
            console.log('css');
        },
        html:function(value){
            console.log('html');
        }
    }

    //构造函数的原型
    Z.prototype = $.fn;
})(window)

jQuery中实现原型的方式:

index.html代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <P>jquery test 1</P>
    <P>jquery test 2</P>
    <P>jquery test 3</P>
    <div id="div1">jquery test in div</div>
</body>
<!-- <script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.min.js"></script> -->
<script src="my-jquery.js"></script>
<script type="text/javascript">
	//初始化实例
    var $p = $('p');
    $p.css('color', 'red');
    console.log($p.html());

	//初始化实例
    var $div1 = $('#div1');
    $div1.css('color', 'blue')
    console.log($div1.html());
</script>
</html>

my-jquery.js代码:

//定义一个自执行函数,避免全局变量的污染
(function (window) {
    var jQuery = function (selector) {
        return new jQuery.fn.init(selector)
    }

    jQuery.fn = {
        css:function(key,value){
            console.log('css');
        },
        html:function(value){
            console.log('html');
        }
    }

    //定义构造函数
    var init = jQuery.fn.init = function (selector) {
   	    //document.querySelectorAll获取的是类数组,通过数组的slice方法将类数组转化成真正的数组
        var slice = Array.prototype.slice;
        var dom = slice.call(document.querySelectorAll(dom));

        var i, len = dom ? dom.length : 0;
        for (i = 0; i < len; i++) {
            this[i] = dom[i];
        }
        this.length = len;
        this.selector = selector || '';
    }

    init.prototype = jQuery.fn;

    window.$ = jQuery;
    
})(window)

原型的扩展性

为何把原型方法放在 $.fn 上而不是直接赋值一个对象?
在这里插入图片描述
原因如下:

  • 只把 $ 暴露在window全局变量中,其它的变量不暴露在函数外。
  • 将插件扩展统一到 $.fn.xxx 这一个接口,方便管理使用。
$.fn.getNodeName = function(){
	return this[0].nodeName;
}

完整代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <P>jquery test 1</P>
    <P>jquery test 2</P>
    <P>jquery test 3</P>
    <div id="div1">jquery test in div</div>
</body>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

<script>
    //插件代码
    $.fn.getNodeName = function () {
        console.log(this[0].nodeName);
    }
</script>

<script type="text/javascript">
    //验证代码
    var $p = $('p');
    $p.getNodeName();
    var $div1 = $('#div1');
    $div1.getNodeName();
</script>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值