Проблемы у Вас есть, что функция AddtoSyllables
не является функция члена или метода из URLObject
. Это всего лишь вложенная функция без объектных вложений, поэтому все способы использования this
приведут к возврату объекта окна dom. Правильный способ объявления функции AddtoSyllables
заключается в следующем:
function URLObject()
{
//...
}
URLObject.prototype.AddtoSyllables = function (AWord)
{
var SylCount = this.syllables.length;
alert("This is SylCount: " + SylCount);
}
Чтобы объяснить причины поведения в этом вопросе, я хотел бы уточнить, что объекты в JavaScript рассматриваются как карты, словарь или пара ключевых значений (используйте термин, который подходит вам лучше всего). Использование синтаксиса x.y = value;
эквивалентно присвоению значения value
на карте x
с ключом y
. Имея код:
this.AddtoSyllables = AddtoSyllables;
function AddtoSyllables(AWord)
{
var SylCount = this.syllables.length;
alert("This is SylCount: " + SylCount);
}
добавляет функцию AddtoSyllables
как запись на объект this
указывает. Код
myobj.AdtoSyllables(...)
эквивалентно
myobj["AdtoSyllables"](...) // now a retreiaval operation
или даже
var fn = myobj["AdtoSyllables"];
fn (...);
Внутри функции AdtoSyllables
, this
используется.Против общих ожиданий, это не указатель на myobj
.
Причиной этого является то, что AddtoSyllables
рассматривается как статический метод из URLObject
класса (как ООП ребята поняли бы это), или даже свободная статическая функция (например, в C). Чтобы заставить JS рассматривать его как член объекта URLObject
(метод экземпляра для парней ООП), JS должно быть сказано сделать это. Это достигается посредством URLObject.prototype.AddtoSyllables = ....
, который эквивалентен объявлению метода экземпляра.
С альтернативной точки зрения:
function foo() { /* some code using `this` */ }
var bar = {};
var baz = {};
bar.foo = foo; // same as bar["foo"] = foo;
baz.foo = foo; // same az baz["foo"] = foo;
В приведенном выше коде, this
порядки внутри foo
не будет ни точка, ни bar
baz
. В то же время bar.foo
укажет на тот же экземпляр, что и baz.foo
, для foo
также является объектом.
myobj.AdtoSyllables («текст»); должен быть myobj.AddtoSyllables («текст»); ... – RafH
Какой браузер? Код работает отлично для меня (после исправления опечатки). –
Да, может быть полезно создать [скрипку] (http://jsfiddle.net/) - это очень просто, чтобы люди могли точно видеть, что происходит и сравнивать браузеры. – Jeff