【问题标题】:Javascript not extending class properlyJavascript没有正确扩展类
【发布时间】:2014-06-06 16:11:32
【问题描述】:

我已经写了这段代码,还没有为任何真正的功能设置我只是定义一个结构

function Finder(d) {
this.ajax = {
    current : null,
    call : function(url,data) {
        //Todo Ajax Code here
    },
    success : function() {
        //Todo: Default Ajax Success Functiality
    },
    error : function(xhr, ajaxOptions, thrownError) {
        //Todo: Default Ajax Failure Functionality
    }
};
d.constructor.extend = function(def){
    for (var k in d) {
        if ( !def.hasOwnProperty(k)) {
            def[k] = d[k];
        }
        return Finder(def);
    }
}
return (d.constructor.prototype = d).constructor;
}

var ModelInput = Finder({
constructor: function() {
    //Todo: Setup functionality
},
registerEvents : function() {
    //Todo: Register Dom Events for ModelInput
}
});



var foo = new ModelInput();

foo 的控制台输出;

Finder.constructor {constructor: function, registerEvents: function}
__proto__: Object
constructor: function () {
registerEvents: function () {
__proto__: Object

我的问题是为什么当我实例化 new ModelInput(); 时不包含 Finder(); 的方法和属性?

【问题讨论】:

  • 你到底想在这里做什么?您的代码非常混乱..您是否将 Finder 定义为基类,然后将其扩展为 ModelInput?
  • 请注意,即使您正确使用原型继承,正如 SergeS 所建议的那样,ModelInput 永远不会包含 Finder 的方法,但 ModelInput 的原型 Finder 将具有方法。如果您真的喜欢extends,请查看“伪经典继承”
  • Stack Overflow上有很多关于JS继承的问题,随便搜一下。您还会找到比您在这里得到的更好的答案。
  • @semiomant 你指出了我正确的方向,非常感谢!

标签: javascript oop inheritance


【解决方案1】:
  1. Javascript 没有继承 - 只能向原型添加函数

  2. 你的代码也有点乱,用其他原型的一些方法创建原型的最简单方法是

    function A( ) {
        doSomethingWithThis..
    }
    
    A.prototype = { ... }
    
    function B( ) {
        A.call( this );
    }
    
    B.prototype = new A();
    
    B.prototype.method = function() {
    
    }
    

附言。再一次 - Javascript 不是经典的 OOP 语言,因此请考虑重新设计您的概念以使用工厂方法

    function getFinder( ) {
        var thisObj = {};

        thisObj.someFunction = someFunction.bind( thisObj );

        return thisObj;
    }

【讨论】:

    【解决方案2】:

    好吧,我能做到这一点的唯一方法就是制作原型......所以我要做的是......

    http://jsfiddle.net/b2JM8/

    // used for extending classes into new classes
    Function.prototype.Implement = function (base) {
        var c = Function.prototype.Implement.nonconstructor;
        c.prototype = new base();
        this.prototype = new c();
    };
    Function.prototype.Implement.nonconstructor = function () { };
    
    
    var BaseClass = function() {
    
        var me = this;
    
        me.BaseMethodOne = function () {
           alert('BaseMethodOne');
        };
    
        me.BaseMethodTwo= function () {
            alert('BaseMethodTwo');
        };
    }
    
    
    var MyClass = function() {
    
        var me = this;
    
        me.MyMethodOne = function () {
           alert('MyMethodOne ');
        };
    
        me.MyMethodTwo= function () {
            alert('MyMethodTwo');
        };
    }
    
    MyClass.Implement(BaseClass);
    
    
    var myObject = new MyClass();
    
    myObject.BaseMethodOne();
    myObject.BaseMethodTwo();
    myObject.MyMethodOne();
    myObject.MyMethodTwo();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多