在工作中,我们使用 jQuery。在我们开始使用它后不久,我看到几个开发人员正在向文件 jquery-extensions.js 添加函数。在内部,我发现添加到 $ 的一大堆方法基本上相当于 jQuery 上的静态方法。这里有一些:
$.formatString(str, args) {
...
}
$.objectToArray(obj) {
...
}
等等。 它们实际上都没有使用任何与 jQuery 相关的东西。这让我觉得很奇怪。
最终,我们的库中需要一个函数来本地化日期。我的解决方案是创建:
Date.prototype.toLocaleDate = function() {
...
}
Date.parseLocalDate = function() {
...
}
这样做后不久,一位高级开发人员走过来问我我认为我在做什么。他告诉我,在我工作的地方,我们不会创建原型(prototype),因为它们是邪恶的。他给出的唯一原因是它们从根本上说是一种糟糕的语言特性,因为它们“可能被滥用”并且看到原型(prototype)会让人感到困惑(例如,我怎么知道 new Date().toLocaleDate() 是原型(prototype)而不是原生 ECMAScript ).通过使用 $.formatString(...) 而不是 "blah blah".formatString(...),我们清楚地表明任何带有 $ 的东西都是不是 native JavaScript 的一部分。
这些理由看起来有点傻,但我提供了一个折衷方案,这样他就不必记住方法是否是原型(prototype)——在原型(prototype)函数名称前加上 $ 前缀:
String.prototype.$format = function() {
...
}
"blah blah".$format(...);
这很快就被驳回了,现在我不得不在所有地方添加这些 $.myPrototypeAsAFauxStaticMethodOnjQuery() 函数。
只有我认为这种做法很愚蠢吗?
最佳答案
关于原生原型(prototype)的争论有点累,双方都有道理,我会尝试总结一下,希望对全局有帮助。
contra 无需扩展原生原型(prototype)。您已获得所需的一切。
pro JS标准库稀缺到极点。数组和字符串缺少许多重要的特性。
反对使用函数或您自己的“命名空间”。
pro foo.trim() 这样的方法比 org.blah.trim(foo) 这样的函数更符合语言的精神。在 javascript 中一切都是对象,就这样吧。
contra 原生 JS 对象是“保留”给语言设计者的。我们的方法可能会意外覆盖新添加的内置函数。
pro 打开对象是一个很棒的功能,不使用它会很愚蠢。新的 Javascript 版本不是每天都会发生,并且标准的添加是事先众所周知的。
contra 扩展 native 原型(prototype)令人困惑,因为我们的方法和 native 方法之间没有区别。
pro JS 标准库很小而且文档齐全。我们 javascript 开发人员应该知道本地方法的名称。
contra 扩展原型(prototype)会导致 namespace 冲突。
pro 是的,但这也可能发生在全局函数或众所周知的全局对象(如 $)中。
contra 自定义方法是可枚举的。
pro 是的,但是 hasOwnProperty 可以解决这个问题。将其包装在您自己的枚举器函数中,并停止对对象使用原始 for..in 循环。
(不是真正的答案,因此是 CW)
关于javascript - native 原型(prototype)与 $.extension(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3795422/
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/
所以,Ruby1.9.1现在是declaredstable.Rails应该与它一起工作,并且正在慢慢地将gem移植到它。它具有native线程和全局解释器锁(GIL)。自从GIL到位后,原生线程是否比1.9.1中的绿色线程有任何优势? 最佳答案 1.9中的线程是原生的,但它们被“放慢了速度”,一次只允许一个线程运行。这是因为如果线程真的并行运行,它会混淆现有代码。优点:IO现在在线程中是异步的。如果一个线程阻塞在IO上,那么另一个线程将继续执行直到IO完成。C扩展可以使用真正的线程。缺点:任何非线程安全的C扩展都可能存在使用Thre
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi
我正在运行命令bundleinstall在我的Rails项目中,它给出了错误:...Usingactiverecord(3.0.11)Usingactiveresource(3.0.11)Usingbigdecimal(1.1.0)Installingfcgi(0.8.8)withnativeextensionsGem::Installer::ExtensionBuildError:ERROR:Failedtobuildgemnativeextension./home/jjboat/.rvm/rubies/ruby-1.9.3-p194/bin/rubyextconf.rbchecki
我在安装“redcarpet”gem时遇到以下错误。它在我friend的机器上安装没有问题。(我想安装它来运行yard)ruby版本:1.9.3命令输出:D:\Learning\Common_POM_FW\SampleProjects>yard[error]:Missing'redcarpet'gemforMarkdownformatting.Installitwith`geminstallredcarpet`D:\Learning\Common_POM_FW\SampleProjects>geminstallredcarpetTemporarilyenhancingPATHtoinc
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如