我有一个Javascript对象,我想传递更多参数,但文档是不存在的。我唯一的选择似乎是对Javascript对象进行反向工程,以查看我可以传递的参数和值。
例如,我想查看对象是否有“zoom”参数以及我可以传递给“mapType”参数的值:
<script type="text/javascript" src="http://maps.google.com/maps?oe=utf-8&file=api&v=2&key=your-gmap-key"></script>
<script type="text/javascript" src="https://share.findmespot.com/spot-widget/js/SpotMain.js"></script>
<script type="text/javascript">
var widget = new Spot.Ui.LiveWidget({ renderTo: "spot-live-widget",
feeds: [ "0Wl3diTJcqqvncI6NNsoqJV5ygrFtQfBB" ],
height: 400,
width: 500,
mapType: "physical"
});
</script>
<div id="spot-live-widget"/>
关于如何做到这一点的任何想法?
答案 0 :(得分:3)
Function#toString
如果调用函数实例的toString
方法,大多数Javascript实现都将返回函数的源代码:
function foo() {
return a;
}
alert(foo.toString()); // Alerts "function foo() { return a; }"
这是非标准行为,但受到广泛支持;您可能会发现它对逆向工程非常有用。在Spot.Ui.LiveWidget
函数上调用它可能很有趣,以及绑定到它返回的对象属性的函数。这带给我们......
编辑当然,如果unobfuscated source is available(向肖恩喊出来),你不需要这个......
for..in
如果它确实是一个Javascript对象,您可以这样做以找出它具有的属性:
var name, own;
for (name in obj) {
own = obj.hasOwnProperty(name);
alert(name + " (" + (own ? "own" : "inherited") + ")");
}
这会告诉你它(可枚举)属性的名称,以及它们是实例本身的属性,还是它的原型对象。
for..in
示例function Thingy() {
}
Thingy.prototype.alpha = "a";
var t = new Thingy();
t.beta = "2";
上面的循环会显示:
alpha (inherited) beta (own)
(没有特别的顺序。)
请注意,并非所有属性都是“可枚举的”。例如,由Array
,String
等对象上的规范指定的所有(或几乎所有)属性都是不可枚举的。但直到最近,这只是Javascript实现本身可以完成的事情;没有机制将自己的属性标记为不可枚举。新的第5版规范提供了一种方法,但它尚未广泛支持或使用(尚未)。
您要查询的对象可能会根据属性存在来改变其行为;在那种情况下,你无法知道,因为一个不存在的属性没有显示在for..in
循环中(与存在但具有undefined
值的属性不同, )。 E.g:
function doSomething(options) {
if (options.foo) {
// There's a `foo` and it has a value; do something with it
}
foo
上的options
属性可能不存在 ,因此这种逆向工程不会显示代码对它做了什么。
不要在主机对象(例如DOM节点)上尝试上面的for..in
循环。它可能在某些实现中有效,但通常不会,在某些情况下(IE6)它会使浏览器崩溃。但是,它对于Javascript对象来说是完全安全的。
答案 1 :(得分:3)
嗯......你可以看一下来源......
您的代码会导致https://share.findmespot.com/spot-widget/js/SpotMain.js
这导致https://share.findmespot.com/spot-widget/js/Spot.js,你使用http://jsbeautifier.org/解压缩,它显示不,它不能在其构造函数中使用'zoom'参数,但它确实有setZoomAndCenter
方法
setZoomAndCenter: function (C) {
var B = new GLatLngBounds;
for (var A = 0; A < C.length; A++) {
B.extend(C[A].getPoint())
}
this._map.setZoom(this._map.getBoundsZoomLevel(B));
this._map.setCenter(B.getCenter())
},
从中我们可以看到它有一个'私有'成员_map,它有一个setZoom
方法。
这有帮助吗?
<强>更新强>
上述方法实际上是Spot.Ui.MapRenderer
的成员,而不是LiveWidget。
MapRenderer在LiveWidget内部使用,但未公开......
答案 2 :(得分:0)
无法保证配置参数中列出的属性与结果对象的属性相匹配,或者它们将被复制到生成的对象中,即使它们是。
唯一的方法是查看LiveWidget“构造函数”函数中的代码,并查看配置参数所需的属性。