【发布时间】:2022-01-13 20:43:59
【问题描述】:
有许多 JQuery 函数似乎只是返回对相同对象的引用,只是为了促进调用链。但是在处理特定实例很重要的事情时,我注意到如果我测试对象是否相等,则返回的对象不是同一个对象。但是,它们反映了相同的信息。
从 .css() 返回的对象有什么“不同”?为什么他们不只是修改实例并返回相同的实例,是否有设计原因?
在控制台中我可以这样做,并且两个实例都反映了对第二个实例所做的更新颜色,但是如果对象是同一个对象,则测试 == 返回 false。
var blah = $('#div1');
var blah2 = $('#div1').css('color','red');
blah.css('color'); -- 'rgb(255, 0, 0)'
blah2.css('color'); -- 'rgb(255, 0, 0)'
blah === blah2
false
blah == blah2
false
我想澄清一下,我理解值比较和对象比较之间的区别。我知道测试表明它们是两个单独的对象。这并没有让我感到困惑,它只是让我感到惊讶。他们可以轻松地维护同一个对象,通过它们的句柄修改元素,并返回同一个对象而无需创建新对象。
通常,您会看到带有对象调用链的两种模式之一。每次调用都返回相同的对象引用,保持相同的引用并简单地修改该对象的属性/子对象。或者每次调用都会创建一个新对象,修改并返回该新对象而不修改原始对象。
如果您想遵循不可变的模式,那么第二种方法是有利的,这样每次调用都会生成一个新对象而不修改先前的实例。
在这种情况下,两个对象都引用相同的 HTML 元素并反映相同的信息,所以令我惊讶的是 JQuery 正在创建并返回一个新对象。我认为这是一个明确的设计选择,只是对我来说并不明显。
【问题讨论】:
-
您正在通过使用选择器调用
$创建一个新实例。如果你会做var blah2 = blah.css('color','red');,那么blah === blah2将是真的。 -
@Teemu Dang 我不知道我是怎么错过的。
-
不可能两次“创建”同一个对象。
标签: javascript jquery