Javascript 原型注入,谷歌地图api

Javascript 原型注入,谷歌地图api,javascript,google-maps-api-3,function-prototypes,Javascript,Google Maps Api 3,Function Prototypes,我需要抓住这件事,为我的孩子找回建议。我知道它是没有文件的,但做一些研究,我发现它可能是通过一些原型黑客 <input type='text' id='myInput'> <script src="http://maps.google.com/maps/api/js?libraries=places&amp;sensor=false&amp;language=en-EN"></script> <script> function ca

我需要抓住这件事,为我的孩子找回建议。我知道它是没有文件的,但做一些研究,我发现它可能是通过一些原型黑客

<input type='text' id='myInput'>
<script src="http://maps.google.com/maps/api/js?libraries=places&amp;sensor=false&amp;language=en-EN"></script>
<script>
function catcher(key) { console.log(key); }

function MyProto() {}
MyProto.prototype = new google.maps.MVCObject();
MyProto.prototype.changed = catcher;

var gAuto = new google.maps.places.Autocomplete(
    document.getElementById('myInput'), ['geocode']);

// one of two should be commented

//gAuto.__proto__.__proto__.changed = catcher; // every key, including 'predictions'

gAuto.__proto__.__proto__ = MyProto.prototype; // only 'types', '0', and 'place' when selected
</script>

函数捕捉器(键){console.log(键);}
函数MyProto(){}
MyProto.prototype=new google.maps.MVCObject();
MyProto.prototype.changed=catcher;
var gAuto=new google.maps.places.Autocomplete(
getElementById('myInput'),['geocode']);
//应该对其中一个进行评论
//gAuto.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu每个关键点,包括“预测”
gAuto.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu=MyProto.prototype;//选中时仅“类型”、“0”和“位置”
JSIDLE链接:(检查控制台)

检查最后两行。当直接在MVCObject原型上设置“changed”函数时(第一个,注释),一切都很好,我可以在“catcher”函数中捕捉关键的“预测”。问题是,如果我的页面上需要两个autocomplete实例,那么catcher就需要不同。所以,当我试图在autocomplete的原型链(最后一行)中注入自定义对象时,一切都失败了。有什么办法解决这个问题吗

编辑:,感谢Sajid:-)


更新:,可能对任何人都有帮助。

在第二行中,您将用MVC对象的实例替换整个MVC对象原型,这取决于该对象的初始化方式,可能根本不起作用。第一个like替换了一个函数,尽管在这个过程中它完全破坏了这个函数,因为你没有调用它的超类版本,所以你没有扩展,你真的是太棒了。要避免重击,您需要执行以下操作:

(function() {
    var oldChanged = gAuto.__proto__.__proto__.changed;

    function catcher(key) {
        // call old version, and make sure to maintain this reference correctly
        oldChanged.call(this, key);
        // do your stuff here
    }

    gAuto.__proto__.__proto__.changed = catcher;
})();
一个简单的解决方案是,每个对象都有一个上面提到的
概念。因此
changed
引用了
this
,它将引用用作调用者目标的对象(这里有点超出范围的特定情况除外)。但基本上:

var x = new MVCObject();
x.changed('hi') // this === x

因此,如果您的两个版本需要执行不同的操作,您可以检查更改的方法是从哪个调用的,并做出相应的反应。

在第二行中,您将使用MVC对象的实例替换整个MVC对象原型,具体取决于该对象的初始化方式,这可能根本不起作用。第一个like替换了一个函数,尽管在这个过程中它完全破坏了这个函数,因为你没有调用它的超类版本,所以你没有扩展,你真的是太棒了。要避免重击,您需要执行以下操作:

(function() {
    var oldChanged = gAuto.__proto__.__proto__.changed;

    function catcher(key) {
        // call old version, and make sure to maintain this reference correctly
        oldChanged.call(this, key);
        // do your stuff here
    }

    gAuto.__proto__.__proto__.changed = catcher;
})();
一个简单的解决方案是,每个对象都有一个上面提到的
概念。因此
changed
引用了
this
,它将引用用作调用者目标的对象(这里有点超出范围的特定情况除外)。但基本上:

var x = new MVCObject();
x.changed('hi') // this === x
因此,如果您的两个版本需要执行不同的操作,您可以检查更改后的方法是从哪个
调用的,并做出相应的反应