源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

jquery学习笔记之无new构建详解

  • 时间:2020-01-04 03:00 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:jquery学习笔记之无new构建详解
[b]前言[/b] 当我们想要创建一个对象,我们可能使用new方法去构建一个对象,那按道理jquery也是一个对象,应该也是用[code]new jquery()[/code]来构建呀为什么我们创建jquery对象不用[code]new jquery()[/code]而是直接使用类似[code]$(ele)[/code]的方式去构建出来一个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.01
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na
死循环的问题确实解决了,但是又发现了新的问题,可以看到a和b两个对象的属性是公用的,我修改[code]a.name[/code]属性为na,[code]b.name[/code]属性也跟着变为了na,其原因就是this都是指向Jquery的 为了解决这个问题,我们可以每次调用[code]Jquery()[/code]的时候都构建一个新的对象,改进代码如下:
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); //undefined
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na
这样处理之后,属性共享的问题已经解决了,每个对象都有各自的属性,可以自由修改,每个对象互不影响,但是又又又发现了新的问题,可以看到我们控制台打印a.version这个属性的时候是读取不到这个属性的,原因就在于此时[code]Jquery.prototype[/code]和[code]Jquery.prototype.init.prototype[/code]是互不相干的,我们创建的是[code]Jquery.prototype.init[/code]对象,所以只能读到[code]Jquery.prototype.init.prototype[/code]上的属性而读取不到[code]Jquery.prototype[/code]上的属性的(该例指version这个属性),解决办法很简单,就是把[code]Jquery.prototype[/code]赋值给[code]Jquery.prototype.init.prototype[/code],这样就相当于把Jquery原型上的属性全部赋值到了[code]Jquery.init[/code]的原型上,请看下面代码:
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.01
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na
可以看到,我们控制台打印a对象的version属性,已经可以读取并且打印出来了。 至此,已经完成了Jquery的无new构建。 [b]ps:[/b]jQuery.fn其实就是jQuery的prototype,jquery源码可以看到该条语句:[code]jQuery.fn = jQuery.prototype = {};[/code]   $()和jquery()其实是一样的,jquery源码可以看到该条语句: [code]window.jQuery = window.$ = jQuery;[/code] [b]原型 prototype[/b] [b]认识一下什么是原型?[/b] 在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个" [[Prototype]]"内部属性,这个属性所对应的就是该对象的原型。 对于"prototype"和"__proto__"这两个属性有的时候可能会弄混,"Person.prototype"和"Person.__proto__"是完全不同的。 [b]在这里对"prototype"和"__proto__"进行简单的介绍:[/b] 对于所有的对象,都有__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"
[b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部