0

我是 JavaScript 中的伪类和原型的新手,我在正确实现它时遇到了一些困难。我想要做的是有一个带有一些字段的基“类”,然后创建该基类的原型,并将我的方法定义为对象文字。我在这样做和只在我的基类中使用单例作为我的方法之间左右为难。我认为虽然这样做更优雅一点,但我认为我实际上并不是每次创建新对象时都创建每个方法。

无论如何,我遇到的一个小问题是在我的方法中引用我的基类的字段。因为当我尝试将它们引用为 this.field 时,这指的是当前函数/范围,但我希望它引用新创建的对象。是否有解决此问题的方法,或者我应该改变创建方法的方式。

下面是一些我认为可以更清楚地说明我在做什么以及我遇到的问题的代码。

function BaseClass() {
    this.items[];
    this.fieldOne = "asdasd";
}

BaseClass.prototype = {
    methodOne: function (input) {
        function addElement(a. b) {
            var element = {};
            element.prop1 = a;
            element.prop2 = b;
            //The issue I am having is that items is undefined, how can I refernce the parent class object. 
            this.items.push(element);
        }
        function traverse() {
            //go through a list and add a bunch of elements
            addElement("ASdasd", 324);
        }
    },
    methodTwo: function () {
        //see now fieldOne is asdasd
        console.log("fieldOne" + fieldOne);
    }
}

var forTest = new BaseClass();
forTest.methodTwo();

所以是的,我希望在父类中有一些可以从任何方法访问的字段,但我宁愿不只是将函数放在我的基类中,这样我就不会在每次从 BaseClass 创建新对象时创建每个方法。是否有解决方法或更好的方法来实现这一点?

在此先感谢您的帮助。

4

2 回答 2

2

您正在丢失对this嵌套函数内部的引用。您可以通过以下方式解决:

methodOne: function (input) {
    var self = this;
    function addElement(a. b) {
        var element = {};
        element.prop1 = a;
        element.prop2 = b;
        //The issue I am having is that items is undefined, how can I refernce the parent class object. 
        self.items.push(element);
    }
    function traverse() {
        //go through a list and add a bunch of elements
        addElement("ASdasd", 324);
    }

    // You never called anything?
    // is traverse() what you wanted?
    traverse();
},
于 2013-04-24T18:33:11.937 回答
1
 methodOne: function (input) {
    function addElement(a. b) {
        var element = {};
        element.prop1 = a;
        element.prop2 = b;
        //The issue I am having is that items is undefined, how can I refernce the parent class object. 
        this.items.push(element);
    }

这里的问题是您遇到了 javascript 设计错误,即this在 subfunction中绑定到错误的对象。通常的解决方法如下:

methodOne: function (input) {
  var that = this;
  function addElement(a, b) {
    ...
    that.items.push(element);
  }
}

实际上它绑定到全局对象:

var o = {
  f : function(){
    var g = function(){
      this.name = "test";
    };
    g();
  }
};
o.f();
console.log(name); // "test"
于 2013-04-24T18:34:13.193 回答