【问题标题】:Javascript inheritance using prototype, what is a practical way?Javascript继承使用原型,有什么实用的方法?
【发布时间】:2015-10-29 16:16:18
【问题描述】:

我一直在阅读 Javascript 中的继承,并提出了创建构造函数并定义每个构造函数原型。我创建了一个prototypeExtend 函数,它将遍历每个构造函数原型并将它们添加到主构造函数原型中。

这是实现继承的实用方法吗?

function prototypeExtend() {
    var cMain = arguments[0].prototype;
    for(var i=1; i<arguments.length; i++){
        var cTemp = arguments[i].prototype;
        for(var k in cTemp){
            if(cTemp.hasOwnProperty(k)){
                cMain[k] = cTemp[k];
            }
        }
    }
    return cMain;
}

function Class1 () {}
Class1.prototype = {
        el1:null,
        fun1:function(str){
            console.log(str + " from Class1");
        },
        setEl1:function(value){
            this.el1 = value;
        },
        getEl1:function(){
            return this.el1;
        }
}

function Class2(){}
Class2.prototype = {
        el2:"blah",
        fun2:function(str){
            console.log(str + " from Class2");
        }
}

function Class3(){}
Class3.prototype = {
        el3:"dah",
        fun3:function(str){
            console.log(str + " from Class3");
        },
        fun1:function(str){
            console.log(str + " from Class3");
        }
}
prototypeExtend(Class2, Class1, Class3);
var obj = new Class2;
console.log(obj);

【问题讨论】:

  • 这可能是一个意见问题。对我来说:实现可读代码的方法并不多。这就是为什么像 Dojo 这样的许多 JS 工具包添加了更高级的类型系统的原因。不过,我最喜欢的是转桩语言 TypeScript (typescriptlang.org)

标签: javascript inheritance constructor prototype


【解决方案1】:

在这种状态下,我能想到一些你可能没有看到的东西。您直接在原型描述中为对象的属性提供默认值。请记住,对象(和函数)将通过引用传递,因此如果我可以引用 Java,这些属性将是 static。对对象的任何更改都会影响所有其他引用。

当您需要覆盖函数并且仍然使用父函数时,您还必须更改代码。

如果您的目标是开发自己的库,请牢记这一点并继续前进! ;) 无论如何,您应该看看其他人在网络上做了什么。我个人一直在使用classjs,它为我完成了这项工作!

【讨论】:

    【解决方案2】:

    这里是原型继承与功能继承的好例子

    http://artandlogic.com/2012/07/prototypal-vs-functional-inheritance-in-javascript/

    这似乎是一个非常基于意见的问题,因此没有对错之分。我个人非常喜欢原型方法。

    EDIT1:还可以查看 Douglas Crockford - 他有自己的实现,并且是许多人关注的 javascript 大师

    http://javascript.crockford.com/prototypal.html

    我希望这为您指明了正确的方向

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2013-05-09
      相关资源
      最近更新 更多