2015-03-09 3 views
0

я нашел код, подобный этому в унаследованном приложении:Как я могу получить доступ к функциям прототипа?

var Example = function (var1, var2, var3) { 
    this.prop1 = var1; 
    this.prop2 = var2; 
    this.prop3 = var3 
}; 

Example.prototype = function() { 
    var showAlert = function (message) { 
     alert(message); 
    } 
}; 

var example = new Example(null, null, null); 

Так что я попытался получить доступ к методу прототипа, как это:

example.showAlert("hello"); 

Вот является jsfiddle: http://jsfiddle.net/64dkjke1/

Это Безразлично Не работай. , , метод showAlert не определен. Прототип равен функции, которая определяет другие функции внутри. , , надеюсь, я просто пропустил здесь что-то простое.

Как я могу получить доступ к этой функции прототипа?

спасибо.

+1

Вы уверены, что функция, назначенная прототипу, не возвращает объект и не выполняется в фактическом коде? Я думаю, вы просто неправильно истолковали код, который вы искали при построении этого примера. –

+1

В текущем состоянии невозможно получить доступ к 'showAlert' за пределами функции, которую вы назначаете прототипу. –

+0

Спасибо, Кевин. Я не сомневаюсь, что я неверно истолковал то, что искал. Мне было интересно, почему то, что я пытаюсь, не работает, но я считаю, что вы ответили на это со вторым комментарием. Спасибо. – codenewbie

ответ

1

Было ли это так, вместо этого, прикрепляя объект к прототипу? Трудно определить, в чем проблема, потому что вы говорите, что код, который вы опубликовали, только аналогичен коду в устаревшем приложении, поэтому мы не можем точно знать это.

Example.prototype = { 
    showAlert: function (message) { 
    alert(message); 
    } 
} 
+0

Ну, это структурно похоже на то, что я опубликовал, но тысячи строк дольше. То, что я представил, было уменьшенной версией, чтобы спросить, как получить доступ к одному из методов, которые добавляет прототип. То, что я пропустил, было то, что в самом конце этой прототипной функции возвращаются только 2 функции. Таким образом, две функции были обнародованы, все остальное частным. Теперь я лучше понимаю это. Большое спасибо за Вашу помощь. – codenewbie

1

Вы не можете, вызвать

var showAlert = function (message) { 
    alert(message); 
} 

является частным.

вы можете сделать это:

function abc(){ 
var myPrivateVar = "Hello"; 
    this.alert = function(){ 
    alert(myPrivateVar); 
    } 
} 
new abc().alert(); 

, но это не

var a = new abc(); 
alert(a.myPrivateVar); 
3

Если у вас нет никаких проблем, изменяя исходный код, вы можете сделать следующее, чтобы иметь прототип получить объект, используя IIFE :

Example.prototype = (function() { 
    return { 
     showAlert : function (message) { 
      alert(message); 
     } 
    } 
})(); 

var example = new Example(null, null, null); 

example.showAlert("hello"); 

Fiddle

+0

Было бы неплохо, если бы downvoters объяснили, что с этим не так. –

+0

Я видел, что фактическая функция прототипа, на которую я смотрел, возвратила 2 функции, которые станут общедоступными, и все другие функции, которые она определила, будут закрытыми, если я не выставил их как в вашем примере. Я знал, что что-то забыл.Это тысячи строк, поэтому я уменьшил количество кода, и при этом я пропустил этот ключевой момент. Спасибо. – codenewbie

+0

Я тоже не понимаю, что такое downvoting. Можно утверждать, что вы не показывали, как вызвать прототип, не меняя исходный код, но, как я уже указывал в своем ответе, даже это не имеет никакого значения, поэтому для меня ваш ответ заслуживает моего продвижения. –

1

Вы не можете получить доступ к функции showAlert() (как вы уже выяснили)
Причина этого проста.

Example.prototype = function() 

Не расширить прототип с помощью функции, но переопределениях весь прототип (который вы обычно не хотите делать, если вы не очень хорошо осведомлены о том, что вы делаете). В JavaScript прототипом класса является сама функция. У вас есть доступ к вашему прототипу, вызвав myClass.prototype, который вернет ваш прототип объекта.

Прототип может быть расширен (как и любой другой объект в JavaScript Aswell)
быстрый пример:

Example.prototype.showAlert = function(message){ alert(message); }; 

теперь вы могли бы назвать:

Example.prototype.showAlert("Hi"); 
// or calling it from an instance of Example: 
var myExample = new Example(); 
myExample.showAlert("Hi") 

Так что ваша скрипка делает это заменяет весь прототип с этим:

function() { 
    var showAlert = function (message) { 
     alert(message); 
    } 
}; 

Можно утверждать, что t эта новая функция не служит наилучшим образом как прототип, но все же IS вызываемый (чтобы вернуться к исходному вопросу). Вы можете назвать это так:

Example.prototype() 

Но ничего не случится, так как единственное, что происходит в этой функции является то, что он объявит «частную» функцию внутри этого прототип-сфера, которая никогда не вызывается.

// start of prototype function 
var showAlert = function (message) { 
     alert(message); 
    } 
// end of prototype function 

Я не могу себе представить, что это то, что ваше намерение было, так что мой совет придерживаться проходящих прототипов (но даже это только если вам придется).

+0

Хорошая работа на дополнительном объяснении. –

Смежные вопросы