我是第一次尝试一些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未定义;
请帮我解决上述问题。
答案 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。 : - )