嘿,我有一个问题。我正在编写一个小的Js对象,以便我更容易管理我所在的页面,以便我能够在每页上加载正确的脚本/样式。我遇到了一个我不明白的情况。我有一个属性currentPage
显然足够设置到当前页面,但如果我只是从我之前定义的另一个属性直接设置它,它会返回一个引用错误,但是如果我将它放入一个函数返回同样的,它的工作原理。我不知道为什么会这样。谁可以给我解释一下这个?我不是一个铁杆的JS开发人员,我只是在我去的时候解决问题,这是JS特有的东西吗?这是我的意思的代码示例:
var self = PageInfo = {
locationArray : window.location.pathname.toString().split("/"),
printOutPath : function(){
console.log(self.locationArray.length);
},
//ref. error to locationArray
parentDirectory : self.locationArray[self.locationArray.length -3],
currentPage : function() {
return self.locationArray[self.locationArray.length -2]; // works
}
};
答案 0 :(得分:4)
当您使用JavaScript对象文字语法(使用花括号{}
创建对象)时,每个属性的值都是在创建对象时进行评估的表达式。它们不能引用同一对象的属性,因为该对象尚不存在。
请注意,在对象的方法中,您可以使用this
而不是创建self
变量。只要您使用点语法调用方法,如下所示:
PageInfo.currentPage()
方法this
中的...将自动引用该对象,以便您可以执行此操作:
var PageInfo = {
locationArray : window.location.pathname.toString().split("/"),
printOutPath : function(){
console.log(this.locationArray.length);
},
currentPage : function() { return this.locationArray[this.locationArray.length -2];}
};
alert( PageInfo.currentPage() );
进一步阅读:https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects
答案 1 :(得分:0)
定义对象时,在创建对象之前无法引用该对象。通过使用函数,您将延迟self.locationArray的查找,直到创建了对象。
答案 2 :(得分:0)
仅在执行语句后才将对象分配给self
和PageInfo
。
所以在声明之后这样做。
var self = PageInfo = {
locationArray : window.location.pathname.toString().split("/"),
printOutPath : function(){
console.log(self.locationArray.length);
},
currentPage : function() { return self.locationArray[self.locationArray.length -2]; // works
}
};
self.parentDirectory = self.locationArray[self.locationArray.length -3];
它还会更新PageInfo
使用this
内部函数使其更加OO
var self = PageInfo = {
locationArray : window.location.pathname.toString().split("/"),
printOutPath : function(){
console.log(this.locationArray.length);
},
currentPage : function() { return this.locationArray[this.locationArray.length -2]; // works
}
};
self.parentDirectory = self.locationArray[self.locationArray.length -3];
您还可以创建一个功能来设置parentDirectory
var self = PageInfo = {
locationArray : window.location.pathname.toString().split("/"),
printOutPath : function(){
console.log(this.locationArray.length);
},
parentDirectory:"",
setParentDirectory: function() {
this.parentDirectory = this.locationArray[this.locationArray.length -3];
},
currentPage : function() { return this.locationArray[this.locationArray.length -2]; }
};
self.setParentDirectory();