2013-07-30 4 views
0

У меня есть прототип функции в javascript ... Я хотел бы иметь возможность вызвать другую функцию из этой прототипированной функции.вызов функции из прототипа функции

var objMap = new Map(500,500); 
var myCities = objMap.genValues(5); 

function Map(sizeX, sizeY) { 
    this.sizeX = sizeX; 
    this.sizeY = sizeY; 
} 
Map.prototype = { 
    genValues: function (number) { 
     validateValues(number); 
    } 
} 

function validateValues(num){ 
    alert(num); 
} 

в моей консоли я получаю следующее сообщение об ошибке:

SCRIPT438: Object doesn't support property or method 'genValues'

Когда я не добавить вызов функции validateValues ​​я не получаю сообщение об ошибке. Есть ли способ сделать это? Я хотел бы также иметь возможность вызывать функции рекурсивным образом.

ОБНОВЛЕНИЕ!

Я исправил свой код следующим образом: fiddle: Я по-прежнему получаю ту же ошибку.
Похоже, я неправильно использую функциональность/методологию прототипа, так как я не могу вызывать функции изнутри? Это правильно?

+1

Вам не хватает закрывающего '}' для завершения 'genValues'. –

ответ

1

Вы создаете экземпляр Map, прежде чем назначать прототип; и вы вызываете метод перед его созданием. Объекты, созданные после этого назначения, будут иметь метод genValues. Две ошибки:

function validateValues(num){ 
    alert(num); 
} 

function Map(sizeX, sizeY) { 
    this.sizeX = sizeX; 
    this.sizeY = sizeY; 
} 
// alter the existing prototype object instead of overwriting it 
Map.prototype.genValues = function (number) { 
    validateValues(number); 
} 

// create instances only after the "class" declaration is done! 
var objMap = new Map(500,500); 
var myCities = objMap.genValues(5); 
+2

В качестве дополнения к выгоде OP: причина 'new Map()' работает до функции объявления Map() {...} 'потому, что объявления функций [подняты в верхней части их содержащей функции] (http: //www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html). Однако, в то время как конструктор «Карта» поднят (и, таким образом, «Карта» может использоваться свободно в любом месте той же функции, что и декларация, до или после), присвоение «Map.prototype» * не * поднято, Map.prototype.genValues' доступен только * после * его назначения. – apsillers

+0

@apsillers: Спасибо за ссылку, у меня не было времени на поиск хорошего. – Bergi

+0

@ capsillers Почему не вызывается «Map.prototype»? Будет ли это поднято «Map.prototype.genValues ​​= function() {}'? – neurosnap

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