代码之家  ›  专栏  ›  技术社区  ›  Noah Goodrich

如何在javascript中建立对象之间的继承?

  •  1
  • Noah Goodrich  · 技术社区  · 16 年前

    我有以下代码创建两个对象(profilemanager和employermanager),其中employermanager对象应该从对象profilemanager继承。 但是,当我发出警报(profilemanager的pm instanceof profilemanager)时,它返回false。

    function ProfileFactory(profileType) {
        switch(profileType)
        {
            case 'employer':
                return new EmployerManager();
                break;
        }
    }
    
    function ProfileManager() {
        this.headerHTML = null;
        this.contentHTML = null;
        this.importantHTML = null;
    
        this.controller = null;
    
        this.actions = new Array();
        this.anchors = new Array();
    }
    
    ProfileManager.prototype.loadData = function(action, dao_id, toggleBack) {
    
        var step = this.actions.indexOf(action);
    
        var prv_div = $('div_' + step - 1);
        var nxt_div = $('div_' + step);
    
        new Ajax.Request(this.controller, {
                method: 'get',
                parameters: {action : this.actions[step], dao_id : dao_id},
                onSuccess: function(data) {
                    nxt_div.innerHTML = data.responseText;
    
                    if(step != 1 && !prv_div.empty()) {
                        prv_div.SlideUp();
                    }
    
                    nxt_div.SlideDown();
    
                    for(i = 1; i <= step; i++)
                    {
                        if($('step_anchor_' + i).innerHTML.empty())
                        {
                            $('step_anchor_' + i).innerHTML = this.anchors[i];
                        }
                    }
                }
            }
        )   
    }
    
    EmployerManager.prototype.superclass = ProfileManager;
    
    function EmployerManager() {
        this.superclass();
    
        this.controller = 'eprofile.php';
    
        this.anchors[1] = 'Industries';
        this.anchors[2] = 'Employer Profiles';
        this.anchors[3] = 'Employer Profile';
    
        this.actions[1] = 'index';
        this.actions[2] = 'employer_list';
        this.actions[3] = 'employer_display';   
    }
    
    var pm = new ProfileFactory('employer');
    alert(pm instanceof ProfileManager);
    

    顺便说一句,这是我第一次尝试面向对象的JavaScript,所以如果你觉得有必要对我的方法的愚蠢性发表评论,请随时这样做,但请提供关于如何更好地解决问题的建议。

    7 回复  |  直到 9 年前
        1
  •  2
  •   EndangeredMassa    16 年前

    我一直在使用类似于Dean Edward的base.js模型的东西。 http://dean.edwards.name/weblog/2006/03/base/

        2
  •  2
  •   Dónal    16 年前

    原型通过 Object.extend() 功能。

    然而,有人可能认为,试图在一种不支持类的语言上强加基于类的继承是“当你只有一把锤子,整个世界就像一颗钉子”的一个例子。

        3
  •  1
  •   Noah Goodrich    16 年前

    谢谢你的评论。然而,问题的解决办法是在对雇主管理者声明进行更改时发现的:

    function EmployerManager() {
    
        this.controller = 'eprofile.php';
        this.anchors = new Array('Industries', 'Employer Profiles', 'Employer Profile');
        this.actions = new Array('index', 'employer_list', 'employer_display'); 
    }
    
    EmployerManager.prototype = new ProfileManager;
    

    显然,JavaScript支持两种不同类型的继承,基于函数和基于原型。基于函数的版本是我最初发布的版本,但由于EmployerManager看不到作为ProfileManager原型一部分的LoadData方法,因此无法工作。

    这个新的例子是基于原型的,现在可以工作了。EmployerManager现在是ProfileManager的一个实例。

        4
  •  0
  •   Mr. Muskrat    16 年前

    在代码中,PM是EmployerManager的一个实例,它具有profileManager的超类。这对我来说似乎是倒退。ProfileManager不应该有一个EmployerManager的超类吗?

        5
  •  0
  •   Benry    16 年前

    我只是想插句话,虽然JavaScript是一种面向对象的语言,但它没有其他流行OO语言中常见的许多特性。相反,它还有许多其他流行的OO语言所没有的特性。

    正如您已经发现的,继承是通过原型对象而不是通过类继承来管理的。但是,在使用“instanceof”运算符时,不会检查原型对象。这意味着JavaScript不支持多态性。至少不是开箱即用。

    您可以找到一些库,它们可以使JavaScript符合您过去使用的OOP模型;如果您深陷其中,这可能是最好的解决方案。(虽然在使用“instanceof”进行检查时,没有库会使javascript对象具有多态性;可能需要IsInstanceof函数。)或者您可以选择另一种符合OOP模型的语言,但您可能在浏览器中工作,因此这显然不是一个选项。或者你可以回答这个问题,“如果没有多态性,我如何解决我的问题?”

        6
  •  0
  •   Community THelper    7 年前

    你应该注意到 same question has been asked (由我)。看看那篇文章的答案。

        7
  •  0
  •   cuixiping    9 年前

    你可以使用 新的 Object.create 实现经典传承

    function A(){
        B.call(this);
    }
    function B(){
    }
    
    //there are 2 ways to make instanceof works
    //1. use Object.create
    A.prototype = Object.create(B.prototype);
    //2. use new
    //A.prototype = new B();
    
    console.log(new A() instanceof B); //true
    
    //make instanceof works
    EmployerManager.prototype = Object.create(ProfileManager.prototype);
    //add other prototype memebers
    EmployerManager.prototype.superclass = ProfileManager;
    
    console.log(new EmployerManager() instanceof ProfileManager); //true