Изначальное различие заключается в том, что в вашем первом примере без прототипа реализация функций getSecret
и setSecret
будет находиться на каждом экземпляре spy1.
Во втором примере функции определены в прототипе, и все экземпляры ссылаются на них напрямую, вы можете проверить это:
var bond = new spy1("007"),
bond2 = new spy1("007");
bond.getSecret === bond2.getSecret; // <-- false since they are two functions
var smart = new spy2("86"),
smart2 = new spy2("86");
smart.getSecret === smart2.getSecret; // <-- true since is the same function
// on all instances
Также обратите внимание, что @ T.J. прокомментировал, во втором примере, используя прототип, у вас нет доступа к закрытию функции конструктора, и для этого вы делаете глобальную переменную window.secret
.
Если вы собираетесь работать с привилегированными методами , расширение прототипа не является опцией, все методы, которым требуется доступ к переменным, определенным в области действия функции конструктора, должны быть объявлены внутри него. ...
См. Также: Затворы .