无new构建详解

这次给大家带来无new构建详解,使用无new构建的注意事项有哪些,下面就是实战案例,一起来看一下。

前言

当我们想要创建一个对象,我们可能使用new方法去构建一个对象,那按道理jquery也是一个对象,应该也是用new jquery()来构建呀为什么我们创建jquery对象不用new jquery()而是直接使用类似$(ele)的方式去构建出来一个jquery对象呢?其实内部还是使用了new来构建的,只是jquery内部帮我们构建了而已,请看下面代码

function Jquery(selector, context) {  return new Jquery(selector, context); } Jquery.prototype = {  version:'1.01' }

登录后复制

直接这样内部使用new来构建Jquery,很明显是有问题的,这样的话就形成了死循环。为了解决死循环的问题,请看下面代码:

function Jquery(selector, context) { return Jquery.prototype.init(selector, context);}Jquery.prototype = { version:'1.01', init: function () {  this.name = "lin";  return this; }}var a = Jquery();var b = Jquery();console.log(a.version); //1.01console.log(a.name); //lina.name = "na";console.log(b.name); //na

登录后复制

死循环的问题确实解决了,但是又发现了新的问题,可以看到a和b两个对象的属性是公用的,我修改a.name属性为na,b.name属性也跟着变为了na,其原因就是this都是指向Jquery的

为了解决这个问题,我们可以每次调用Jquery()的时候都构建一个新的对象,改进代码如下:

function Jquery(selector, context) { return new Jquery.prototype.init(selector, context); //注意看,这里多了个new}Jquery.prototype = { version:'1.01', init: function () {  this.name = "lin";  console.log(this);  return this; }}var a = Jquery();var b = Jquery();console.log(a.version); //undefinedconsole.log(a.name); //lina.name = "na";console.log(b.name); //na

登录后复制

这样处理之后,属性共享的问题已经解决了,每个对象都有各自的属性,可以自由修改,每个对象互不影响,但是又又又发现了新的问题,可以看到我们控制台打印a.version这个属性的时候是读取不到这个属性的,原因就在于此时Jquery.prototype和Jquery.prototype.init.prototype是互不相干的,我们创建的是Jquery.prototype.init对象,所以只能读到Jquery.prototype.init.prototype上的属性而读取不到Jquery.prototype上的属性的(该例指version这个属性),解决办法很简单,就是把Jquery.prototype赋值给Jquery.prototype.init.prototype,这样就相当于把Jquery原型上的属性全部赋值到了Jquery.init的原型上,请看下面代码:

function Jquery(selector, context) { return new Jquery.prototype.init(selector, context);}Jquery.prototype = { version:'1.01', init: function () {  this.name = "lin";  return this; }}Jquery.prototype.init.prototype = Jquery.prototype; //画龙点睛之笔var a = Jquery();var b = Jquery();console.log(a.version); //1.01console.log(a.name); //lina.name = "na";console.log(b.name); //na

登录后复制

可以看到,我们控制台打印a对象的version属性,已经可以读取并且打印出来了。

至此,已经完成了Jquery的无new构建。

ps:jQuery.fn其实就是jQuery的prototype,jquery源码可以看到该条语句:jQuery.fn = jQuery.prototype = {};

  $()和jquery()其实是一样的,jquery源码可以看到该条语句: window.jQuery = window.$ = jQuery;

原型 prototype

认识一下什么是原型?

在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个” [[Prototype]]”内部属性,这个属性所对应的就是该对象的原型。

对于”prototype”和”proto”这两个属性有的时候可能会弄混,”Person.prototype”和”Person.proto”是完全不同的。

在这里对”prototype”和”proto”进行简单的介绍:

对于所有的对象,都有proto属性,这个属性对应该对象的原型

对于函数对象,除了proto属性之外,还有prototype属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是设置实例的proto属性)

function Person(name, age){this.name = name;this.age = age;}Person.prototype.getInfo = function(){console.log(this.name + " is " + this.age + " years old");};//调用var will = new Person("Will", 28);will.getInfo();//"Will is 28 years old"

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

两个zTree怎样互相联动

怎样用webpack写jquery的环境配置

jackson解析json串时大小写自动转换的方法

jQuery EasyUI 折叠面板的使用

以上就是无new构建详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2782389.html

(0)
上一篇 2025年3月8日 16:29:52
下一篇 2025年2月25日 16:56:50

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js字典和散列表实例详解

    js字典 字典则是以[键,值]的形式来存储元素。字典也称作映射,本文主要和大家分享js字典和散列表实例详解,希望能帮助到大家。 function Dictionary() {var items = {};this.has = functio…

    编程技术 2025年3月8日
    200
  • vue的自定义动态组件使用详解

    这次给大家带来vue的自定义动态组件使用详解,使用vue自定义动态组件的注意事项有哪些,下面就是实战案例,一起来看一下。  学习了Vue全家桶和一些UI基本够用了,但是用元素的方式使用组件还是不够灵活,比如我们需要通过js代码直接调用组件,…

    2025年3月8日
    200
  • webpack的样式加载详解

    这次给大家带来webpack的样式加载详解,webpack样式加载的注意事项有哪些,下面就是实战案例,一起来看一下。 加载css需要用到css-loader和style-loader css-loader将@import 和 url 处理成…

    2025年3月8日 编程技术
    200
  • webpack的模块热替换详解

    这次给大家带来webpack的模块热替换详解,使用webpack模块热替换的注意事项有哪些,下面就是实战案例,一起来看一下。 全称是Hot Module ReplaceMent(HMR),理解成热模块替换或者模块热替换都可以吧,和.net中…

    2025年3月8日 编程技术
    200
  • javscript的回调函数(callback)详解

    这次给大家带来javscript的回调函数(callback)详解,使用javscript回调函数(callback)的注意事项有哪些,下面就是实战案例,一起来看一下。 研究一下回调函数,回调函数的英文名:callback 函数也是对象,看…

    编程技术 2025年3月8日
    200
  • JS匀速运动实例详解

    本文主要和大家分享JS匀速运动实例详解,希望能帮助到大家,我们先和大家介绍JS运动的基本原理。 JS运动的基本原理: 让p运动起来,关键是修改物体的坐标, op.style.left=offsetLeft+speed+’px’; 登录后复制…

    2025年3月8日
    200
  • js归并算法实例详解

    本文主要和大家分享js归并算法实例详解,希望能帮助到大家。 将数组递归分裂成单个元素  然后合并数组 let data3 = [14, 54, 73, 38, 39, 67, 75, 80, 50, 40, 96, 27, 105, 109…

    编程技术 2025年3月8日
    200
  • javascript的必包详解

    这次给大家带来javascript的必包详解,使用javascript的注意事项有哪些,下面就是实战案例,一起来看一下。 闭包,这个名字好奇怪,言归正传,先说一下js函数的变量作用域以下例子全部基于局部变量 函数内部访问函数外部变量 dem…

    编程技术 2025年3月8日
    200
  • JS面向对象继承详解

    让一个原型对象等于另一个类型的实例,该原型对象的实例拥有继承类型的全部属性和方法,继承类型的实例属性则存在于当前新的原型对象中 。本文主要和大家分享JS面向对象继承详解,希望能帮助到大家。 function person (name ,ag…

    编程技术 2025年3月8日
    200
  • angular的路由ui-router的使用详解

    这次给大家带来angular的路由ui-router的使用详解,使用angular路由ui-router的注意事项有哪些,下面就是实战案例,一起来看一下。 UI-router 安装:npm install –save angul…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论