如何从内部原型访问类变量 - javascript

时间:2015-04-14 07:59:25

标签: javascript prototype

我可能不清楚问题的标题。对不起。

这是我想要做的。

我试图在javascript中使用原型模式。我创建了一个类如下。

var MyClass = null;
(function() {
    MyClass = function() {
        this.clsVar = "I'm inside constructor";
    };

    MyClass.prototype = {
        constructor: MyClass,
        myFunc1: function() {
            console.log("I'm func1 accessing constructor variable : " + this.clsVar);
        },
        nested: {
            myFunc2: function() {
                console.log("I'm func2 accessing constructor variable : " + this.clsVar); // I know, this will never point to the class scope
            }
        }
    }
}())

我正在创建一个对象。

var my = new MyClass();

my.myFunc1(); // which prints "I'm func1 accessing constructor variable : I'm inside constructor" 

my.nested.myFunc1(); // as expected, it prints "I'm func2 accessing constructor variable : undefined

我要做的就是,我应该可以从clsVar

访问nested.myFunc2

是可能的。?非常感谢和需要任何帮助。 感谢。

2 个答案:

答案 0 :(得分:1)

实际上,有一点。

this中的myFunc2不再引用MyClass,而是引用另一个上下文。因此,最快的方法是使用callapply,如:

var myNewObject = new MyClass();
myNewObject.nested.myFunc2.call(myNewObject, arg1, arg2);

myNewObject.nested.myFunc2.apply(myNewObject, [arg1, arg2]);

答案 1 :(得分:0)

JavaScript基于原型的类系统不允许这样做。 MyClass的原型将在该类的所有实例之间共享。在以下代码中,两个实例将使用相同的函数实例...

var first = new MyClass(), second = new MyClass();
first.nested.myFunc2(); <-- Same prototype function
seecond.nested.myFunc2(); <-- Same prototype function

当代码进入&#34; myFunc2&#34;定义,父母应该访问哪个?

如果您需要访问父母&#34;这个&#34;值,您必须使用闭包并在父构造函数中设置嵌套对象,如下所示。

var MyClass = null;

(function() {
    MyClass = function() {
        this.clsVar = "I'm inside constructor";
        var that = this;
        this.nested = {
            myFunc2: function() {
                console.log("I'm func2 accessing constructor variable : " + that.clsVar); // I know, this will never point to the class scope
            }
         }
    };

    MyClass.prototype = {
        constructor: MyClass,
        myFunc1: function() {
            console.log("I'm func1 accessing constructor variable : " + this.clsVar);
        }
    }
}())