>웹 프론트엔드 >JS 튜토리얼 >jquery에서 new 없이 빌드하는 방법

jquery에서 new 없이 빌드하는 방법

亚连
亚连원래의
2018-06-22 13:58:511097검색

대부분의 사람들이 jQuery를 사용할 때 $('')를 사용하여 직접 생성하는 new 없이 첫 번째 생성 방법을 사용합니다. 이번 글은 신설 없이 jquery 스터디 노트 관련 정보를 주로 소개하고 있으니 필요한 친구들은 아래에서 살펴보시면 됩니다.

머리말

객체를 생성하려면 new 메서드를 사용하여 객체를 생성할 수 있습니다. 논리적으로 말하면 jquery도 객체이므로 new jquery() 구성 jquery 객체를 생성하기 위해 <code>new jquery()를 사용하지 않고 jquery 객체를 생성하기 위해 $(ele)와 유사한 메서드를 직접 사용하는 이유는 무엇입니까? 실제로 new는 내부적으로 빌드하는데 여전히 사용되지만 jquery는 내부적으로 빌드하는데 도움이 됩니다. 아래 코드를 참조하세요 new jquery()来构建呀为什么我们创建jquery对象不用new jquery()而是直接使用类似$(ele)的方式去构建出来一个jquery对象呢?其实内部还是使用了new来构建的,只是jquery内部帮我们构建了而已,请看下面代码

function Jquery(selector, context) {
  return new Jquery(selector, context);
 }

 Jquery.prototype = {
  version:&#39;1.01&#39;
 }

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

function Jquery(selector, context) {
 return Jquery.prototype.init(selector, context);
}

Jquery.prototype = {
 version:&#39;1.01&#39;,
 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两个对象的属性是公用的,我修改a.name属性为na,b.name属性也跟着变为了na,其原因就是this都是指向Jquery的

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

function Jquery(selector, context) {
 return new Jquery.prototype.init(selector, context); //注意看,这里多了个new
}

Jquery.prototype = {
 version:&#39;1.01&#39;,
 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这个属性的时候是读取不到这个属性的,原因就在于此时Jquery.prototypeJquery.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:&#39;1.01&#39;,
 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构建。

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

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

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"

내부적으로 new를 사용하여 Jquery를 빌드한다면 분명히 문제가 발생하여 무한 루프가 발생합니다. . 무한 루프 문제를 해결하기 위해 다음 코드를 살펴보시기 바랍니다.

rrreee 무한 루프 문제는 실제로 해결되었지만, 두 개체의 속성이 새로운 문제로 발견된 것을 볼 수 있습니다. a와 b는 공통입니다. a.name 속성이 na로 변경되었고, b.name 속성도 na로 변경되었습니다. 이유는 이것이 Jquery를 가리키기 때문입니다. 이 문제를 해결하기 위해 Jquery()시 새로운 객체가 생성될 때마다 호출하면 됩니다. 개선된 코드는 다음과 같습니다. rrreee

이렇게 처리한 후 문제는 속성 공유 문제가 해결되었습니다. 각 개체는 고유한 속성을 가지며 자유롭게 수정할 수 있습니다. 각 개체는 서로 영향을 미치지 않지만 콘솔에 a.version 속성을 인쇄하면 새로운 문제가 발견됩니다. , Jquery .prototypeJquery.prototype.init.prototype이 서로 관련이 없기 때문에 이 속성을 읽을 수 없습니다. Jquery.prototype.init 객체이므로 읽기만 가능합니다. Jquery.prototype.init.prototype의 속성을 읽을 수 없지만 Jquery.prototype를 읽을 수 없습니다(이 예는 버전 속성을 나타냄). 해결 방법은 매우 간단합니다. <code>Jquery.prototypeJquery.prototype.init.prototype에 할당하면 됩니다. 이는 Jquery 프로토타입의 모든 속성을 Jquery.init에 할당하는 것과 동일합니다. 코드의 프로토타입>에서 다음 코드를 살펴보십시오.

rrreee 콘솔에서 다음의 버전 속성을 인쇄하는 것을 볼 수 있습니다. 읽고 인쇄할 수 있는 객체입니다.

이 시점에서 Jquery의 새로운 무료 구축이 완료되었습니다.

ps:

jQuery.fn은 실제로 jQuery의 프로토타입입니다. jquery 소스 코드에서 다음 문을 볼 수 있습니다. jQuery.fn = jQuery.prototype = {};  $()와 jquery()는 실제로 동일합니다. jquery 소스 코드에서 다음 문을 볼 수 있습니다. window.jQuery = window.$ = jQuery;

프로토타입 프로토타입

프로토타입이 무엇인지 이해하시나요?

JavaScript에서는 프로토타입도 객체입니다. 프로토타입을 통해 객체의 속성 상속을 실현할 수 있습니다. JavaScript 객체는 모두 객체의 프로토타입에 해당하는 "[[Prototype]]" 내부 속성을 포함합니다. .

"prototype"과 "__proto__" 두 속성은 때때로 "Person.prototype"과 "Person.__proto__"가 완전히 다르기 때문에 혼동될 수 있습니다.

다음은 "prototype"과 "__proto__"에 대한 간략한 소개입니다:

모든 객체에는 객체의 프로토타입에 해당하는 __proto__ 속성이 있습니다.

함수 객체의 경우, __proto__를 제외한 속성 외에 , 프로토타입 속성도 있습니다. 함수를 생성자로 사용하여 인스턴스를 생성하면 함수의 프로토타입 속성 값이 모든 객체 인스턴스에 프로토타입으로 할당됩니다(즉, 인스턴스의 __proto__ 속성을 설정함). rrreee 위 내용은 모두를 위해 제가 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.

🎜관련 기사: 🎜🎜🎜 jquery의 휴대폰 터치스크린 슬라이딩 기능에 대하여 🎜🎜🎜🎜 Mac에 nvm을 설치하는 방법(자세한 튜토리얼) 🎜🎜🎜🎜 WeChat 애플릿에서 시간 기능을 구현하는 방법 🎜🎜🎜🎜 webpack에서 🎜🎜에서 생성된 코드 탐색

위 내용은 jquery에서 new 없이 빌드하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.