2010-02-26 17 views
5

創建一個新的JavaScript類說我有以下代碼:動態地從現有對象

var album = new MyObject('album'); 

假設對象被構造時,一串相對於僅相冊屬性都通過AJAX加載。是否有可能創建一個Album類,以便在以後,我可能只是這樣做:

var anotherAlbum = new Album(); 

Album構造會自動將基於什麼時候裝特有的專輯對象的屬性,創建MyObject('album')

回答

2

可以動態創建JavaScript「類」,就像任何其他對象一樣。所以,是的,這可以做到。

你會做的代碼處理Ajax響應是這樣的(假設AJAX響應提供了新的「類」的名稱,這是在一個名爲newClassName變量):

window[newClassName] = function() { 
    // New class name constructor code 
} 

window[newClassName].prototype = { 

    someProperty: "someValue", 

    someMethod: function(a, b) { 
    }, 

    someOtherMethod: function(x) { 
    } 
} 
+0

我的主要問題是,你如何創建「相冊」對象,使之能在應用程序的任何一點被調用 – 2010-02-26 15:19:09

3

這實際上是JavaScript所具有的唯一繼承。 JavaScript有prototypal inheritance(可用於重新創建經典繼承)。這意味着繼承來自另一個對象,而不是類定義。

要創建具有另一個對象的所有屬性的對象很簡單:

function Album() { 
    // do whatever initialization you need to here, all the properties of album 
    // are available on 'this' 
    // e.g., 
    doSomething(this.albumName); 
} 
Album.prototype = album; 

var anotherAlbum = new Album(); 
8

JavaScript是原型的,而不是傳統的,所以如果你想在類的術語,你這樣做是錯誤的。

根本不需要使用new運算符。

var myObject = {attr1: 'val1', attr2: 'val2'}; 

然後,您可以創建一個對象的新實例:您可以使用對象文本創建一個新的對象

var mySecondObject = Object.create(myObject); 

現在你可以改變的mySecondObject的屬性,如果有方法你可以很容易地重載它們:

mySecondObject.attr1 = "Hello"; 

mySecondObject.attr2 = function() { 
          return "World!"; 
         }; 

然後mySecondObject當然會說你℃具myObject的所有屬性reation。

請注意,這是一個簡單的版本,並且這會將所有屬性「公開」。如果你需要一些隱私,可以通過添加一些功能來實現。這有點複雜,所以讓我知道你是否感興趣...

1

你可以使用Douglas Crockford的功能繼承模式。來自Javascript的代碼良好的零件書

var mammal = function (spec) { 
    var that = {}; 

    that.get_name = function () { 
     return spec.name; 
    }; 

    that.says = function () { 
     return spec.saying || ''; 
    }; 

    return that; 
}; 

var myMammal = mammal({name: 'Herb'}); 


var cat = function (spec) { 
    spec.saying = spec.saying || 'meow'; 
    var that = mammal(spec); 
    that.purr = function (n) { 
     var i, s = ''; 
     for (i = 0; i < n; i += 1) { 
      if (s) { 
       s += '-'; 
      } 
      s += 'r'; 
     } 
     return s; 
    }; 
    that.get_name = function () { 
     return that.says() + ' ' + spec.name + 
       ' ' + that.says(); 
    return that; 
}; 

var myCat = cat({name: 'Henrietta'}); 

它使用函數來裝飾現有的JavaScript對象具有新的功能和屬性。這樣你可以在飛行中增加新的功能和屬性,以現有的對象

-1

你可以做到這一點

var NewClass=function(){ 
    this.id=null; 
    this.name=null; 
    this.show=function(){ 
     alert(this.id+" "+this.name; 
    } 
} 
NewClass.prototype.clear=function(){ 
    this.id=null; 
    this.name=null; 
}; 

... 

var ins1=new NewClass(); 
var ins2=new NewClass(); 
+1

我不明白這是如何回答這個5歲的問題。 – 2015-06-29 06:01:54