Javascript OOP帮助/建议/解释

时间:2012-03-06 20:53:05

标签: javascript oop web

嘿,我有一个问题。我正在编写一个小的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
    } 
};

3 个答案:

答案 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)

仅在执行语句后才将对象分配给selfPageInfo。 所以在声明之后这样做。

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();