面向对象的javascript - “this”关键字和访问对象内的函数

时间:2011-02-02 14:44:34

标签: javascript

我是第一次尝试一些OO JS。这是我到目前为止所提出的:

var myObj = {
1   site_url: window.location.protocol + "//" + window.location.hostname + "/",
2   site_host: window.location.hostname,
3   site_brand: this.readCookie('aCookieName'),
4   site_full_url: this.site_url + window.location.pathname,
5   /***
6   Read a cookie by its name;
7   **/
8
9   readCookie: function(name) {
10      var nameEQ = name + "=";
11      var ca = document.cookie.split(';');
12      for(var i=0;i < ca.length;i++) {
13          var c = ca[i];
14          while (c.charAt(0) == ' ') c = c.substring(1, c.length);
15          if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
16      }
17      return null;
18  },
19
20  /***
20  ***/
22  SaySomeThing: function() {
23      alert(this.site_brand);
24  }
}

忍受我,我是新手。我遇到的问题是:

第3行 - 我收到错误:readCookie未定义;
第4行 - 另一个错误:site_url未定义;

请帮我解决上述问题。

5 个答案:

答案 0 :(得分:4)

在javascript中,对象没有this的概念。

this关键字的值是在函数中通过 调用该函数来确定的。

例如,在您的myObj中,如果您这样做:

myObj.readCookie('someName');

然后在readCookie函数内,this将设置为myObj

如果您希望site_brand调用readCookie函数,那么您应该为site_brand提供自己的函数来调用它:

site_brand: function() { return this.readCookie('aCookieName'); },

......并称之为:

myObj.site_brand()

...以便this函数中的site_brand引用myObj


编辑:问题中的代码有所改变(由于我认为格式化)。

答案是一样的,但我要注意,只要从this.site_brand调用SaySomeThing,就可以在SaySomeThing函数中调用myObj。< / p>

 // this is fine
SaySomeThing: function() {
   alert(this.site_brand);
}

 // as long as you're calling it something like
myObj.SaySomeThing();

答案 1 :(得分:0)

尝试在功能中包装您的site_属性:

site_brand: function() { return this.readCookie('aCookieName'); }

答案 2 :(得分:0)

根据上面的语法突出显示,您似乎已注释掉了readCookie方法。这是您的实际代码出现的方式吗?

答案 3 :(得分:0)

问题是this不是您认为的那样。它将具有周围范围中this值的值。除了您希望利用ECMAScript 5之外,还有其他用户发布的内容,您可以使用新的getter语法。

get site_brand() {
    return this.readCookie('aCookieName');
}

这将允许您使用没有括号的属性。

obj.site_brand // Call the getter.

答案 4 :(得分:0)

避免使用this。除非在特定情况下,否则通常不需要它。 这是我写这个(匆忙)的方式:

var myObj = (function {
    /***
    Read a cookie by its name;
    ***/
    var readCookie = function(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
          var c = ca[i];
          while (c.charAt(0) == ' ') c = c.substring(1, c.length);
          if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return null;
    };
    var saySomeThing = function() {
        alert(this.site_brand);
    };

    var result = {
        site_url: window.location.protocol + "//" + window.location.hostname + "/",
        site_host: window.location.hostname
        site_brand: readCookie('aCookieName'),
        site_full_url: null, // you can't access other parts of the same object in an object literal
        saySomeThing: saySomeThing
    };
    result.site_full_url = result.site_url + window.location.pathname;

    return result;
})();

这假设您不需要readCookie对象外部的myObj函数,并且您 想要从saySomeThing访问{{1}}在你的对象之外。

通过将整个定义包装在匿名函数(立即执行)中,您可以隐藏除了新创建的对象之外的所有人的“readCookie”和“saySomeThing”函数。

我强烈建议您阅读Douglas Crockford。 : - )