我正在研究OOP以及jQuery之类的框架是如何工作的。如果我使用改变类属性的方法创建类,它会为所有变量调用更改它:
class test{
constructor(selector) {
this.el = document.querySelectorAll(selector);
return this;
}
find(selector) {
this.el = this.el[0].querySelectorAll(selector); //well...
return this;
}
}
function x(selector){ return new test(selector); }
var p = x('#parent'); //returns #parent
var c = p.find('#child') //returns #child
console.log(p); //returns #child too!
但是如果我使用jQuery它就像我需要的那样:
var p = $('#parent'); //returns #parent
var c = p.find('#child') //returns #child
console.log(p); //returns #parent
我理解“find”方法替换类的属性,变量“p”就像类实例的快捷方式。但是如何让它像jQuery一样工作呢?
jQuery的作用方式是它不会像以前那样给你相同的元素,而是一个新元素。如果我们对您的代码使用相同的技术,它看起来会像这样:
class test{
constructor(selector) {
this.el = document.querySelectorAll(selector);
return this;
}
find(selector) {
return new test(selector); //return a new instance
}
}
function x(selector){ return new test(selector); }
var p = x('#parent'); //will return #parent
var c = p.find('#child') //will return #child - this is a separate instance
console.log(p); //will still return #parent because it's not modified by .find()
这个例子可能有点过分,但一般的想法仍然存在 - 如果你不想改变它,不要修改主对象的状态。如果你确实需要对新状态采取行动但仍然保留旧状态,那么只有两个对象就更容易了。