我最近开始为项目使用原型设计。这是我第一次使用原型设计,所以仍然找到我的腿:)我来自一个面向对象的背景,所以请原谅我,如果我的一些术语不正确。
我使用它的一个主要原因是为项目创建一个范围框架,以避免以后发生任何冲突。我还使用它来创建分布在多个文件中的对象。
但是我遇到了麻烦。
我在一个文件中声明了我的基类“class”。在另一个文件中,我然后声明该类的扩展。在这个扩展中,我声明了一个函数,然后我尝试从基类调用它。最后,我在基类中声明了一个扩展实例,以允许我从基类调用扩展函数。
但是,当我尝试创建实例时,出现以下错误:
SCRIPT445:对象不支持此操作leave.js,第2行 角色5
以下是我的代码片段:
leave.js
var _LEAVE = function () {
this.WORK_LIST = new this._WORK_LIST();
}
worklist.js
_LEAVE.prototype._WORK_LIST = function (params) {
var Render = function(){
...
}
}
对于我做错了什么以及如何解决它的任何建议都将不胜感激。
答案 0 :(得分:3)
好吧,首先如果你不理解基于原型的继承,那么我建议你learn关于它。实际上这很简单。
其次,请不要以错误的方式采取这种做法 - 你的代码憎恨我。我知道你来自古典背景,我尊重你所做的努力。但是,实际上,即使我付钱,我也不想阅读你的代码。
这就是我的所作所为(如果我的程序不是你想要的,请纠正我,但我真的不知道你的代码中发生了什么):
// baseClass.js
function BaseClass() { // class BaseClass
var extendedObject = new Extension;
}
// extension.js
Extension.prototype = new BaseClass; // Extension extends BaseClass
Extension.prototype.constructor = Extension; // reset the constructor property
function Extension() { // class Extension
// some private variables
var privateVar = null;
function privateFunction() {}
// some public properties
this.publicVar = null;
this.publicFunction = function () {};
}
此外,由于您来自经典背景,因此可以帮助您编写更符合传统继承风格的代码。阅读此answer。它会对你有所帮助。
修改:使用我的script,您可以按照以下方式在JavaScript中创建类。
baseClass.js
:
/*
class BaseClass {
var extension;
function constructor() {
extension = new Extension;
}
}
*/
var BaseClass = new Class(function () {
var extension;
function constructor() {
extension = new Extension;
}
return constructor;
});
extension.js
:
/*
class Extension extends BaseClass {
var secret;
function constructor() {
secret = null;
}
this.getSecret = function () {
return secret;
};
this.setSecret = function (newSecret) {
secret = newSecret;
};
}
*/
var Extension = new Class(function () {
var secret;
function constructor() {
secret = null;
}
this.getSecret = function () {
return secret;
};
this.setSecret = function (newSecret) {
secret = newSecret;
};
return constructor;
}, BaseClass);
您可能会修改fiddle。
答案 1 :(得分:0)
如果您未使用_LEAVE
实例化new
,this
将引用window
对象。试试这个:
var _LEAVE = function () {
this.WORK_LIST = new this._WORK_LIST();
}
_LEAVE.prototype._WORK_LIST = function (params) {
var Render = function(){
...
}
}
console.log(new _LEAVE());