我在层次结构中有多个对象,这些对象具有从超类继承的公共属性和方法,以及子类中特定于对象的属性和方法。我还是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.
*/
});
}
}
答案 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语言之间的区别。如果有任何不清楚的地方,请随意在评论中提问(对不起我的英语)。