美文网首页
前端JS进阶五(原型)

前端JS进阶五(原型)

作者: EmilioWeng | 来源:发表于2018-08-14 22:55 被阅读0次

Zepto中如何使用原型

//index.html
  <!DOCTYPE html>
  <html>
  <head>
      <meta charset="UTF-8">
      <title>Document</title>
  </head>
  <body>
      <p>zepto test 1</p>
      <p>zepto test 2</p>
      <p>zepto test 3</p>

      <div id="div1">
         <p>zepto test in div</p>
      </div>

      <script type="text/javascript" src="./my-zepto.js"></script>
      <script type="text/javascript">
          var $p = $('p')
          $p.css('font-size', '40px')    //CSS是原型方法
          alert($p.html())    //html是原型方法
  
          var $div1 = $('#div1')
          $div1.css('color', 'blue')    //CSS是原型方法
          alert($div1.html())    //html是原型方法
      </script>
  </body>
  </html>
Zepto使用原型源码分析
//my-zepto.js
  (function (window) {  //定义一个函数避免全局变量污染
      //空对象
      var zepto = {}
      //构造函数
      function Z(dom, selector) {
          var i, len = dom ? dom.length : 0
          for (i = 0; i < len; i++) {  //循环把dom数组赋值给this数组
              this[i] = dom[i]
          }
          this.length = len
          this.selector = selector || ''
      }

      zepto.Z = function (dom, selector) {
          return new Z(dom, selector)   //注意这里的new
      }
      
      zepto.init = function (selector) {
          //源码中这里情况很复杂 这里只针对原型来分析
          var slice = Array.prototype.slice   
          var dom = slice.call(document.querySelectorAll(selector))  //选择的dom节点数组
          return zepto.Z(dom, selector)
      }
      //Zepto里的$
      var $ = function (selector) {  //类似于函数开头
          return zepto.init(selector)
      }
      window.$ = $   //只让$变成全局变量

      $.fn = {   
          css: function (key, value) {
              alert('css')
          },
          html: function (value) {
              return '这是一个模拟的 html 函数'
          }
      }
      Z.prototype = $.fn   //构造函数Z的原型等于$.fn这一个对象
  })(window)

jQuery中如何使用原型

//index.js
  <!DOCTYPE html>
  <html>
  <head>
      <meta charset="UTF-8">
      <title>Document</title>
  </head>
  <body>
      <p>jquery test 1</p>
      <p>jquery test 2</p>
      <p>jquery test 3</p>

      <div id="div1">
          <p>jquery test in div</p>
      </div>

      <script type="text/javascript" src="./my-jquery.js"></script>
      <script type="text/javascript">
          var $p = $('p')
          $p.css('font-size', '40px')  //css是原型方法
          alert($p.html())  //html是原型方法
          var $div1 = $('#div1')
          $div1.css('color', 'blue')  //css是原型方法
          alert($div1.html())  //html是原型方法
      </script>
  </body>
  </html>
jQuery使用原型源码分析
//my-jquery.js
  (function (window) {
      var jQuery = function (selector) {      //jQuery里中$等同于jQuery
          return new jQuery.fn.init(selector)     //注意new关键字
      }
      //初始化 jQuery.fn
      jQuery.fn = {
          css: function (key, value) {
              alert('css')
          },
          html: function (value) {
              return 'html'
          }
      }
      //定义构造函数 与上面zepto的构造函数是一致的
      var init = jQuery.fn.init = function (selector) {
          var slice = Array.prototype.slice
          var dom = slice.call(document.querySelectorAll(selector))

          var i, len = dom ? dom.length : 0
          for (i = 0; i < len; i++) {
              this[i] = dom[i]
          }
          this.length = len
          this.selector = selector || ''
      }
      //构造函数的原型等于jQuery.fn这一个对象
      init.prototype = jQuery.fn

      window.$ = jQuery

  })(window)

原型的扩展性(插件机制)

这里思考一下

  • zepto代码中为什么要先把整个JS对象赋值给$.fn,再把$.fn赋值给Z.prototype,也就是为什么需要$.fn承担一个中介的作用?
  • jQuery代码中为什么要先把整个JS对象赋值给 jQuery.fn,再把 jQuery.fn赋值给init.prototype,也就是为什么需要 jQuery.fn承担一个中介的作用?
//因为要做插件 拓展原型
  $.fn.getNodeName = function(){
    return this[0].nodeName
  }

因为:

  • 只有$会暴露在window全局变量
  • 命名为$.fn是为了统一接口形式,能将新来的插件放在构造函数的属性中。
//插件扩展示例
  <!DOCTYPE html>
  <html>
  <head>
      <meta charset="UTF-8">
      <title>Document</title>
  </head>
  <body>
      <p>jquery test 1</p>
      <p>jquery test 2</p>
      <p>jquery test 3</p>
      <div id="div1">
          <p>jquery test in div</p>
      </div>
      <script type="text/javascript" src="./jquery-3.2.1.js"></script>
      <script type="text/javascript">
          // 插件扩展
          $.fn.getNodeName = function () {
              alert(this[0].nodeName)
          }
      </script>
      <script type="text/javascript">
          // 验证
          var $p = $('p')
          $p.getNodeName()
          var $div1 = $('#div1')
          $div1.getNodeName()
      </script>
  </body>
  </html>

相关文章

  • 前端JS进阶五(原型)

    Zepto中如何使用原型 Zepto使用原型源码分析 jQuery中如何使用原型 jQuery使用原型源码分析 原...

  • Javascript(三)之原型继承理解

    进阶路线 3 原型继承 3.1 优秀文章 最详尽的 JS 原型与原型链终极详解 一 最详尽的 JS 原型与原型链终...

  • js中的new操作符实现原理

    序言 这是前端进阶的文章,要想知道new的原理,必须深刻理解原型链、js继承的几种方式与及call、apply等相...

  • js进阶--原型

    对象 对于js中的对象,新手的第一反应应该是用{}包起来的键值对,在jquery中我们可以称这种类型的对象为纯对象...

  • 前端开发必须知道的JS(一) 原型和继承(转载)

    前端开发必须知道的JS(一) 原型和继承 原型和闭包是Js语言的难点,此文主要讲原型及原型实现的继承,在(二)中会...

  • web前端面试之js继承与原型链(码动未来)

    web前端面试之js继承与原型链(码动未来) 3.2.1、JavaScript原型,原型链 ? 有什么特点? 每个...

  • 初识JavaScript

    什么是JS JavaScript,简称JS,是前端的默认脚本语言。JS是一门基于事件原型面向对象的编程语言,前端三...

  • vue入门——大前端

    大前端进阶 前端三剑客:HTML+CSS+JS 前端框架:jQuery、BootStrap、Vue vue的思想是...

  • nodejs 学习指南

    社区 官网 cnode中文网 饿了么大前端 Node.js 进阶教程 文章 WEB前端知识总结 前端攻略系列

  • JS进阶之原型

    之前有在自己的文章中谈到对象,而说到对象我们就不可避免的要扯到原型,并且原型也是我们必须得理解到位的一个点,那接下...

网友评论

      本文标题:前端JS进阶五(原型)

      本文链接:https://www.haomeiwen.com/subject/pervbftx.html