1

我正在尝试构建我的第一个自定义对象,它看起来像这样:

function  URLObject()
{
   this.syllables = new Array();
   etc...

   this.AddtoSyllables = AddtoSyllables;
   function AddtoSyllables(AWord)
   {
       var SylCount = this.syllables.length;
       alert("This is SylCount: " + SylCount);
   }
}

var myobj = new URLObject();
myobj.AdtoSyllables("text");

上述代码的执行导致 JS 引擎打印出以下内容:

这是Sylcount:NAN

-或者-

这是 SylCount:未定义。

我查看了 Head First Javascript、Javascript 圣经和各种 JS 网站上的信息。它们都详尽地涵盖了对象数组的使用,但没有一个讨论对象内的数组。

然而我在这里做错了什么,我不知道是什么。任何人都可以帮忙吗?

4

4 回答 4

2

首先,发布的代码实际上适用于我在 Chrome 和 Firefox 上;所以这必须依赖于 JavaScript 引擎,否则会发生一些奇怪的事情。

更新:我怀疑可能让你感到困惑的是一些单独的调用AddtoSyllables(在你没有向我们展示的代码中)突然this.syllables不再定义。这是 的行为this可能会令人困惑的地方。我创建了一个 jsFiddle,希望能解释它如何为您更好地工作。

http://jsfiddle.net/J3tUb/

也就是说,通常很有可能编写这样的代码而根本不必使用this(或原型)。例如:

function createURLObject() {
   // Use closed-over locals instead of attaching properties.
   var syllables = new Array();

   function AddToSyllables(AWord) {
     // Since syllables is closed over, it is accessible here
     // (but WON'T be accessible outside this scope).
     syllables.push(AWord);
     return syllables.length;
   }

   // Expose whatever functionality you want to be "public"
   // in the returned object.
   return {
     AddToSyllables: AddToSyllables
   };
}

var myObj = createURLObject();
myObj.AddToSyllables("text");

当然,了解 JavaScript 在this. 也就是说,一旦你理解了它,我怀疑你会发现它通常可以完全避免。

于 2013-05-07T21:01:27.463 回答
2

干得好:

function  URLObject()
{
   this.syllables = [];
   etc...
}

URLObject.prototype.addToSyllables = function(aWord) {
  var SylCount = this.syllables.length;
  alert("This is SylCount: " + SylCount);
}

var myobj = new URLObject();
myobj.adtoSyllables("text");

.prototype将在它之后声明的函数添加到构造函数构造的每个对象。(在您的情况下,由 实例化的每个对象new URLObject()

于 2013-05-07T20:53:41.660 回答
0

你需要这样做:

function URLObject()
{
var that = this;
that.AddtoSyllables = AddtoSyllables;
function AddtoSyllables(AWord)  

等等... 像这样,您可以将方法和属性添加到一个对象。

于 2013-05-07T20:53:10.797 回答
0

您遇到的问题是该函数AddtoSyllables不是. 它只是一个没有对象附件的嵌套函数,所以所有的使用都会导致返回dom窗口对象。声明函数的正确方法是:URLObjectthisAddtoSyllables

function  URLObject()
{
    //...
}

URLObject.prototype.AddtoSyllables = function (AWord)
{
    var SylCount = this.syllables.length;
    alert("This is SylCount: " + SylCount);
}

为了解释问题中行为的原因,我想澄清一下 javascript 中的对象被视为地图、字典或键值对(使用最适合您的术语)。使用语法x.y = value;等效于将值放入带有 keyvalue的映射中。有代码:xy

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也是一个对象。

于 2013-05-07T20:55:51.973 回答