小编EML*_*EML的帖子

封装与封装类相比?

我是JS的新手(来自C++ /等),我刚刚想到闭包似乎是一种比类更简单,更方便的处理封装的方法.这段代码似乎提供了一种处理封装的简单方法:

function addProperty(o) {
   var value;

   o["get"] = function()  { return value; }
   o["set"] = function(v) { value = v; }
}

// create two independent objects which are instances of pseudo-class 'addProperty',
// which each have their own version of a set of local fields, and methods that
// operate on those fields:
var a = {};
addProperty(a);
var b = {};
addProperty(b);
Run Code Online (Sandbox Code Playgroud)

如果你只是想要一个类来处理封装(在C++中,我发现这是大部分时间),有没有什么好的理由使用JS类而不是闭包?在我看来,上面的代码比JS类更直观,更紧凑.没有构造函数,原型或过度使用'this'.您还可以获得必须明确声明本地字段的好处,而不是希望您不在构造函数中进行任何拼写错误.

编辑

好的,我只是澄清一下.似乎'class'这个词得到了一些支持.无论如何,对我而言,"类"是类型概念的延伸,而JS在这方面没有资格,但我可以用我的书(Flanagan)花费50页调用类来做各种类的事情.有点.

无论如何,真正的问题是:我在我的第一个网络应用程序上使用jQuery选项卡.我昨天注意到这不起作用,因为我的JS代码没有为每个选项卡保留任何私有状态.当我在选项卡之间切换时,我的代码的动态/鼠标部分不再正常工作.

那么,将私有状态引入应用程序的最佳方法是什么?大多数代码都是安全的,但处理动态行为的所有内容都需要某种方式来封装每个选项卡的本地状态.使用C++背景,我明显的答案是编写一个定义选项卡动态部分的类,并在每次创建选项卡时实例化一个新的"选项卡"对象.我发现难以理解的是JS伪类在这里是否真的有意义,或者我是否应该扩展上面的代码.

刚刚阅读Jonathan的模块模式链接,现在在我看来可能就是答案.

谢谢.

javascript closures class

22
推荐指数
3
解决办法
1万
查看次数

将Google电子表格日期转换为JS Date对象?

我已经绕过这一个...我有一个包含两个日期的电子表格,我需要找到两者之间经过的年数(即某个人在给定日期的年龄;这是替换Excel的DATEDIF).

第一步是将Google的序列号转换为JS Date对象,但似乎没有Date构造函数执行此操作.有任何想法吗?

谢谢.

javascript datetime google-sheets google-apps-script

13
推荐指数
4
解决办法
8738
查看次数

对JavaScript闭包的误解

我是JavaScript的新手,在理解这段代码时遇到了问题:

function addProperty(o) {
   var value;

   o["get"] = function()  { return value; }
   o["set"] = function(v) { value = v; }
}

var a = {};
addProperty(a);
var b = {};
addProperty(b);

a.set(4);
b.set(5);
print("a is " + a.get() + "; b is " + b.get());
Run Code Online (Sandbox Code Playgroud)

打印(在v8/d8中)a is 4; b is 5.如果我注释掉这var value;条线,我明白了a is 5; b is 5.'价值'对象在哪里,为什么有两个?谢谢.

javascript closures

8
推荐指数
1
解决办法
209
查看次数

jQueryUI标签和Firefox:getBBox坏了吗?

刚开发的前端几乎全部采用FF 3.6.它在IE9(即使有很多SVG),Opera和Webkit中也能很好地工作,但在FF9中却完全破解了.我花了一整天的时间来调试它,看起来getBBox在某个地方已经破了.可能存在两个单独的问题,两者都与在包含多个文本元素的组上获取边界框,旋转文本或跨多行分布的文本相关.

有人见过这个吗?我必须说我真的,真的,生气了.Bugzilla没什么.如果他们没有这样一个愚蠢的发布周期,我会想回去尝试一个旧版本,但只是倾倒它似乎要容易得多......

编辑

对于任何以这种方式来的人来说,这就是答案.它基本上与jQuery UI选项卡display:none和维度计算有关,但问题是jqueryui.com(此处)的解决方法不完整.

1 - getBBox问题通常是由于display:none某个地方,但我的代码没有明确display:none

2 - FireFox比其他浏览器更容易出现display/getBBox问题.奇怪的是,Win7上的FF 9.0.1优于XP上的9.0.1

3 - 在隐藏选项卡(或隐藏的任何东西)中进行维度计算的标准方法是在屏幕外显示(参见上面的链接),而不是应用 display:none

4 - 如果没有上面链接的解决方法,FF会抛出异常,Chrome会出错,Opera不关心等等

5 - 但上面的解决方法(屏幕外显示.ui-tabs-hide)是不够的.如果你这样做,但在进行维度计算选择了tab(tabs('select')),那么FF仍然可能会出错(但它不会引发异常).IE9,Opera和Webkit都可以.

6 - 我错了FF 3.6 - 3.6/Linux似乎与FF 9.0.1/XP相同

7 - 没有深入挖掘标签代码,一个修复就是在进行维度计算之前选择标签.对我来说没问题,但是对于大多数人来说可能会失败.

将主题更改为提及标签.

javascript firefox svg jquery-ui-tabs

2
推荐指数
1
解决办法
923
查看次数

将事件附加到动态生成的HTML?

将静态html表转换为JavaScript生成的表时出现问题.以前,我的js/jQuery代码在表中的数据元素上设置了单击处理程序,如下所示:

$(function() {
   $('my_table td').click(function(e) {
   ...handler code
});
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我必须更改我的表,以便在JavaScript中动态生成内容:

// 'table_contents' is "<table><tbody>...</tbody></table>"
$('#my_table').html(table_contents);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我失去了点击处理程序.我想这并不奇怪,因为我只是删除旧的HTML并用新的html替换它.但是,我不知道如何正确处理这个问题.我可以给我的匿名函数命名并在我更改html时调用它,或者我是否必须执行其他操作,例如向每个新td元素显式添加事件侦听器?在更换旧的html之后,我是否必须做任何事情来清理,比如释放旧的处理程序/监听器?js是否有内存/资源泄漏,我必须手动修复?

谢谢.

编辑

很抱歉对此感到愚蠢,但我无法获得建议的on/delegate解决方案.我的测试html是:

<div id="date_test">
<table><tbody><td>42</td></tbody></table>
</div>
Run Code Online (Sandbox Code Playgroud)

我试图以td3种不同的方式回应'42' 的点击:

$("#date_test").on("click", "td", function() {
   alert($(this).text());
});

$('#date_test').delegate('td', 'click', function() {
   alert($(this).text());
});

$(function() {
   $('#date_test td').click(function() {
      alert($(this).text());
   })
})
Run Code Online (Sandbox Code Playgroud)

其中,只有第三个起作用.请注意,这是完全静态的代码; 这是3个不同的减少测试用例.对于前两种情况,代码永远不会执行; 我可以输入语法错误而不是警报,它没有任何区别.知道我做错了什么吗?我在使用jQuery 1.7.谢谢.

html javascript jquery javascript-events

2
推荐指数
1
解决办法
2054
查看次数