您遇到的问题是该函数AddtoSyllables
不是. 它只是一个没有对象附件的嵌套函数,所以所有的使用都会导致返回dom窗口对象。声明函数的正确方法是:URLObject
this
AddtoSyllables
function URLObject()
{
//...
}
URLObject.prototype.AddtoSyllables = function (AWord)
{
var SylCount = this.syllables.length;
alert("This is SylCount: " + SylCount);
}
为了解释问题中行为的原因,我想澄清一下 javascript 中的对象被视为地图、字典或键值对(使用最适合您的术语)。使用语法x.y = value;
等效于将值放入带有 keyvalue
的映射中。有代码: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
(正如 OOP 人员所理解的那样),甚至是松散的静态函数(如在 C 中)。为了让 JS 将其视为URLObject
对象的成员(OOP 人员的实例方法),必须告诉 JS 这样做。这是通过URLObject.prototype.AddtoSyllables = ....
which 等价于声明实例方法来实现的。
从另一个角度来看:
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
也是一个对象。