当构造函数显式返回对象文字时,为什么继承原型对象不起作用?

时间:2013-06-12 16:45:20

标签: javascript oop inheritance prototypal-inheritance

我目前正在学习使用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 ++相比,奇怪......)。谁能请我解释或澄清这个问题?关于我的方法论的其他意见/建议也是受欢迎的(在那里肯定会有一些不好的做法!)。

全部谢谢:)

0 个答案:

没有答案