簡體   English   中英

在javascript中使用內部對象文字之間的函數

[英]Use of functions between inner object literals in javascript

我的問題是我的js類中有2個內部對象,我正在嘗試使用其他對象中的一個對象中的方法(我在下面嘗試做的例子)。 我理解為什么這不起作用,因為范圍。 我只是想知道是否有辦法讓它發揮作用。

var Class1 = {

    self : this,
    Obj1 : {

        Obj1Method : function () {
            alert("Do something");
        },
        Obj1Method2 : function () {
            alert("Do something else");
        },

        InnerObj1 : {
            InnerNestObj1Method : function (val) {
                alert(val + 2);
            }
        }
    },

    Class1Method2 : function () {
        this.Obj1.Obj1Method2();
    },

    Obj2 : {

        Obj2Method : function (val2) {
            self.Obj1.InnerObj1.InnerNestObj1Method(val2);
        },

        Obj2Method2 : function () {
            self.Class1Method2();
        }
    }
};

Class1.Obj1.InnerObj1.InnerNestObj1Method(3); //works
Class1.Class1Method2(); //works
Class1.Obj2.Obj2Method2(); //No bueno
Class1.Obj2.Obj2Method(5); //No bueno

你可以通過用Class1替換self來修復你的例子。 self : this,是設置Class1.self指向全局對象( this時線被評估)。

 var Class1 = { self : this, Obj1 : { Obj1Method : function () { alert("Do something"); }, Obj1Method2 : function () { alert("Do something else"); }, InnerObj1 : { InnerNestObj1Method : function (val) { alert(val + 2); } } }, Class1Method2 : function () { this.Obj1.Obj1Method2(); }, Obj2 : { Obj2Method : function (val2) { Class1.Obj1.InnerObj1.InnerNestObj1Method(val2); }, Obj2Method2 : function () { Class1.Class1Method2(); } } }; Class1.Obj1.InnerObj1.InnerNestObj1Method(3); //works Class1.Class1Method2(); //works Class1.Obj2.Obj2Method2(); //bueno Class1.Obj2.Obj2Method(5); //bueno 

當你做self: this時會發生什么self: this

// If this is running in non strict mode, from the global scope, `this` points
// To the global object because there was no function call setting `this`
var Class1 = {
    self : this,
};

您需要了解的是, this是由使用this函數調用函數的人設置的。 在上面的例子中,沒有呼叫者,因此運行時設置this指向全局對象。

以下是您可以如何使對象更具可重用性,並為自己提供對外部對象的引用:

 function createClass() { var self = { Obj1: { Obj1Method: function() { alert("Do something"); }, Obj1Method2: function() { alert("Do something else"); }, InnerObj1: { InnerNestObj1Method: function(val) { alert(val + 2); } } }, Class1Method2: function() { self.Obj1.Obj1Method2(); }, Obj2: { Obj2Method: function(val2) { self.Obj1.InnerObj1.InnerNestObj1Method(val2); }, Obj2Method2: function() { self.Class1Method2(); } } }; return self; } var Class1 = createClass(); Class1.Obj1.InnerObj1.InnerNestObj1Method(3); //works Class1.Class1Method2(); //works Class1.Obj2.Obj2Method2(); //works Class1.Obj2.Obj2Method(5); //works 

你可以用Classes做到這一點:

 "use strict" class Class1 { constructor() { this.Obj1 = { Obj1Method: function() { alert("Do something"); }, Obj1Method2: function() { alert("Do something else"); }, InnerObj1: { InnerNestObj1Method: function(val) { alert(val + 2); } } }; var self = this; this.Obj2 = { Obj2Method: function(val2) { self.Obj1.InnerObj1.InnerNestObj1Method(val2); }, Obj2Method2: function() { self.Class1Method2(); } }; } Class1Method2() { this.Obj1.Obj1Method2(); } }; var c1 = new Class1(); c1.Obj1.InnerObj1.InnerNestObj1Method(3); //works c1.Class1Method2(); //works c1.Obj2.Obj2Method(3); //works c1.Obj2.Obj2Method2(); //works 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM