如何在对象中使用ajax来填充对象的实例变量?

时间:2009-10-03 00:37:16

标签: javascript ajax inheritance oop

我在层次结构中有多个对象,这些对象具有从超类继承的公共属性和方法,以及子类中特定于对象的属性和方法。我还是OOP javascript的新手,所以可能有更好的方法。我正在为AJAX使用jQuery,但不确定这是否有所不同。

function Obj(input) {
    this.in = input;
    this.out = {
        content: this.in,
        category: {},
        owner: utils.getValidUser(),
        state: 0,
        meta: {}
    };
    this.process = function() {
       console.log("No Process Defined");
    }
}

function MovieObj(input) {
    this.inheritFrom = Obj;
    this.inheritFrom();
    this.out.type = "movie";
}

function ActionMovie(input) {
        this.inheritFrom = MovieObj;
        this.inheritFrom();
        this.out.genre = "action";
        this.process = function() {
            console.log("movie search");
            $.getJSON("/api/search/"+ escape(this.out.content),
              function(data) {
                /* 
                   I want to modify the object properties according to
                   what comes back from the ajax call.
                */
            });
        }
}

2 个答案:

答案 0 :(得分:2)

这是我早期代码的原型方法,以及对调用对象的简单引用,它解决了继承问题和范围问题。

// Define Superclass
function Obj(input) {
    this.content = input;
    this.type = "object";
    this.owner = utils.getValidUser();
    this.state = 0;
}
Obj.prototype.process = function() {
       console.log("No Process Defined");
};


// Define Movie Subclass
function MovieObj(input) {
    Obj.call(this, input); 
    this.type = "movie";
}
MovieObj.prototype = new Obj();

// Define ActionMovie as subclass of Movie and apply new process method.
function ActionMovie(input) {
    MovieObj.call(this, input);
    this.genre = "action";
}
ActionMovie.prototype = new MovieObj();
ActionMovie.prototype.process = function() {
            var _obj = this;
            $.getJSON("/api/search/"+ escape(this.content),
              function(data) {
                /* 
                   I want to modify the object properties according to
                   what comes back from the ajax call.
                */
                _obj.meta.title data.title;
            });
        }
}

现在实际上有效,但有一些警告。如上所述,每次定义一个新对象时都会调用超类的构造函数,因此会进行大量不必要的调用。

此代码基于以下链接中包含的信息,该链接还描述了Mozilla特定的解决方法: http://www.spheredev.org/wiki/Prototypes_in_JavaScript

答案 1 :(得分:0)

噢,面向对象的JavaScript有点奇怪的方法:)

当我得到你想要的实现模型时,你正在使用你熟悉的其他语言构建你的对象。我是this.inheritFrom。在JS中没有类,对象直接从对象继承。一种方式(网络上有很多讨论)是使用new关键字进行的,因为

var MovieObj = new Obj(input);
MovieObj.out.type = "movie";

为了所有的乐趣,你需要熟悉原型继承,你的代码看起来像

function Obj(input){
    /* some stuff here */
};

function MovieObj(){};
MovieObj.prototype = new Obj();
MovieObj.prototype.constructor = MovieObj();
MovieObj.protorype.out.type = 'movie';

var actionMovie = new MovieObj();
/* do some stuff here with your final object actionMovie */

希望它能帮助您理解oo js和其他oo语言之间的区别。如果有任何不清楚的地方,请随意在评论中提问(对不起我的英语)。