我目前正在学习使用Javascript模拟类继承(C ++风格)的不同方法。具体来说,我一直在尝试创建两个对象"类" (构造函数包含在立即调用的函数中,如在模块设计模式中),第二个使用第一个类作为其原型对象。
在示例中,我有一个Vehicle"类":
// Prototype object
var Vehicle = function(){
var Constructor = function(){
var _type = "Vehicle";
this.GetType = function(){
return _type;
};
};
return Constructor;
}();
接下来我有一辆" Car"类:
// Constructor based on prototype
var Car = function(){
var Constructor = function( name, make ){
// Inerit the prototype class
this.__proto__ = new Vehicle();
// Private
var _name = name;
var _make = make;
// Privileged
this.GetName = function(){
return _name;
};
this.GetMake = function(){
return _make;
};
};
return Constructor;
}();
在Car构造函数中,我将原型设置为Vehicle的新实例。为了测试这一切是否正常,我使用以下jQuery:
$(document).ready( function(){
var myCar = new Car( 'betsy', 'Lexus' );
alert( "GetType: " + myCar.GetType() + " GetName: " + myCar.GetName() + " GetMake: " + myCar.GetMake() );
});
一切正常。当我打开页面时,会出现对话框,并确认myCar.GetType()返回" Vehicle"正如它应该。
我一直在阅读揭示模块模式,到目前为止,由于其清晰度,我发现它非常有用。但是,如果我尝试用以下内容替换上面显示的Vehicle和Car类:
// Prototype object
var Vehicle = function(){
var Constructor = function(){
var _type = "Vehicle";
var _getType = function(){
return _type;
};
return{
GetType: _getType
};
};
return Constructor;
}();
// Constructor based on prototype
var Car = function(){
var Constructor = function( name, make ){
// Inerit the prototype class
this.__proto__ = new Vehicle();
// Private
var _name = name;
var _make = make;
var _getName = function(){
return _name;
};
var _getMake = function(){
return _make;
};
return {
GetName: _getName,
GetMake: _getMake
};
};
return Constructor;
}();
突然,它拒绝工作。现在据我所知,现有的JS知识,新的"类"与旧的完全相同,不同之处在于成员函数是在本地创建的,并且在返回的对象文字中暴露给公共范围(这种创建类的方法在我之前的实验中运行良好)。我不明白差异在哪里。我还在尝试习惯JS中的许多陌生人概念(至少与C ++相比,奇怪......)。谁能请我解释或澄清这个问题?关于我的方法论的其他意见/建议也是受欢迎的(在那里肯定会有一些不好的做法!)。
全部谢谢:)