我正在编写一个 Javascript 堆栈跟踪库。该库需要检测特定对象或函数是否由程序员创建或是否作为环境的一部分(包括内置对象)存在。宿主对象由于其不可预测的行为而变得有点问题,因此我采用与环境无关的方法来确定 Javascript 中的特定对象是否是宿主对象(请参阅 ECMAScript 3 - 4.3.8)。但是,将宿主对象与 native 对象和原始值区分开来对其他项目中的程序员很有用,尤其是在无浏览器环境中,所以我想关注这一点,而不是宿主对象在我的库中引起的问题或区分程序员-创建的对象。
到目前为止,我只能提出依赖于运行 javascript 代码的环境的解决方案。例如:
// IE Only: does not implement valueOf() in Host Objects
var isHost = (typeof obj === 'object' && typeof obj.valueOf === 'undefined');
// Firefox Only: Host objects have own constructor
var isHost = (obj.constructor && obj.hasOwnProperty('constructor'));
我注意到 jQuery 自己的 isPlainObject()方法也依赖于环境,逻辑比较复杂。
也许这是因为宿主对象就是野兽的本性(因为它们的行为是由环境定义的),但我想进一步挖掘一下,看看这是否可能,并且想知道是否有人遇到过这个特定的问题之前已经准备好了解决方案。
所以。有人知道一个简单的独立于平台的解决方案来测试主机对象吗?如果它在无浏览器环境(如 Node 或 Rhino)中运行,那就更好了。
可能的方法(可能行不通):
Object.prototype.toString() ,因为它的定义非常具体,但结果是不确定的,因为某些环境(即 IE)选择为 native 和主机返回相同的值对象。构造函数是否真的是instanceof Function来做到这一点。最佳答案
当您查看 definition of host object — “由宿主环境提供的对象,以完成 ECMAScript 的执行环境。” — 很明显,没有简单的方法可以确定对象是宿主对象还是 native 对象。
与本地对象不同,宿主对象以特定于实现的方式定义内部属性(例如 [[Prototype]]、[[Class]] 等)。那是因为 specification allows them to do this .但是,宿主对象没有“必须”要求以特定于实现的方式实现内部行为;这是“可能”类型的要求。所以我们不能依赖这个。这些对象可能会或可能不会表现得“怪异”。没办法说。
过去很少尝试检测宿主对象,但所有这些显然都依赖于对特定环境的观察(MSHTML DOM 就是其中之一)——请记住,宿主对象没有任何类型的独特模式/特征来识别。彼得·米修 documented most of the inferences here (看看“功能测试主机对象”部分)。臭名昭著的 typeof ... == "unknown" 来自 MSHTML DOM 及其基于 ActiveX 的宿主对象。请注意,Peter 主要在浏览器脚本上下文中谈论宿主对象,他将检查范围缩小到“这是一个宿主方法吗?”、“这是一个宿主集合对象”等。
在某些环境中,宿主对象不从 Object.prototype 继承(使其易于检查),或者具有引发错误的某些属性(例如,某些“接口(interface)”对象上的“原型(prototype)”在 IE 中),甚至在访问时自己抛出错误。
您似乎可以只检查一个对象是否是规范中定义的对象之一,如果不是,则将其视为宿主。但这并没有什么帮助;它只会给你不是内置的对象。其中一些非标准对象可能仍然是原生的(这意味着它们将实现规范中描述的常用语义)。
您最好的选择是测试您的应用程序/脚本的特定行为,宿主对象可能对其敏感。这始终是最安全的方法。您打算访问某个对象的某些内容吗?从对象中删除一些东西?给对象加点东西?测试它。看看它是否有效。如果没有,您可能正在处理宿主对象。
关于javascript - 是否有一种与环境无关的方法来检测 Javascript 主机对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8645685/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss