2014-06-06 37 views
1

我寫了這個代碼,尚未設立任何真正的功能,我只是定義結構的Javascript不延長類正確

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(); 
富的

控制檯輸出;

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

我的問題是,爲什麼當我實例化一個new ModelInput();不會在不包含Finder();的方法和屬性?

+0

什麼是你到底想在這裏做什麼?你的代碼很混亂..你是否將Finder定義爲基類,然後將其擴展到ModelInput? –

+0

請注意,即使您正確使用原型繼承,正如SergeS所建議的那樣,ModelInput將永遠不會包含Finder的方法,但ModelInput的原型Finder將擁有這些方法。如果你真的**進入'擴展'看看「僞古典繼承」 – semiomant

+1

關於在堆棧溢出JS的繼承,只是搜索它有很多問題。你也會找到比你得到的更好的答案。 –

回答

0
  1. JavaScript沒有傳承 - 有原型

  2. 您的代碼也有點亂,與其他原型的一些方法創造原型的simpliest方式是

    增加功能的唯一可能性
    function A() { 
        doSomethingWithThis.. 
    } 
    
    A.prototype = { ... } 
    
    function B() { 
        A.call(this); 
    } 
    
    B.prototype = new A(); 
    
    B.prototype.method = function() { 
    
    } 
    

PS。再次 - JavaScript是不是經典的OOP語言,所以考慮重新加工您的概念,例如使用工廠方法

function getFinder() { 
     var thisObj = {}; 

     thisObj.someFunction = someFunction.bind(thisObj); 

     return thisObj; 
    } 
0

好了,所以我一直沒有人能夠做到這一點是有原型的唯一途徑..所以我什麼做的是...

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();