2010-07-02 107 views
7

我有一個使用JSON定義的現有對象的數組。這些對象顯然是對象類型。如何將它們與自定義對象類型相關聯以賦予它們特定的功能?使用JavaScript更改對象的類型

+0

該對象是否具有附加屬性/方法,你還需要什麼?你能提供一些例子嗎? – mykhal 2010-07-02 16:29:54

+0

..我的意思是,你有這樣的自定義對象類型已經定義,或者你想知道如何做到這一點? – mykhal 2010-07-02 16:38:55

回答

11

那將在所有瀏覽器的工作方式是,要麼增加每個項目你想要的屬性和方法在陣列中,或者對象傳遞給一個構造函數和創建基於舊的對象的新對象屬性和方法。

或者,如果你不關心IE:

var obj = { 
    name : "Jeremy" 
}; 

function CustomType() { 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
} 

CustomType.prototype.sayHi = function() { 
    alert(this.greeting + ", " + this.name); 
}; 

obj.__proto__ = CustomType.prototype; 
obj.constructor.call(obj); 

obj.sayHi(); 
+1

我確實在乎IE,並且隨着你的建議去創建一個方法來修改傳入的對象並將它返回給調用者。我習慣於在Perl中使用「祝福」並能夠隨時修改對象。 – Ray 2010-07-06 14:06:14

4

我不認爲有任何方法可以在創建對象後改變其類型。幸運的是,您可能實際上並不需要更改對象的類別 - 您可能會滿意於爲對象提供一些新的方法和其他功能。 (唯一真正的區別是如果您更改班級會發生什麼情況,並且大多數人在代碼運行時不會更改班級。)

我會爲您工作一個示例。首先,我將創建一個簡單的對象來表示你擁有的JSON對象:

var myobj = new Object() 
myobj.name = "Fred" 

然後,我會創建一些類,您希望能夠分配到myobj

function Speaker() { 
    this.speak = function() { 
     window.alert("Hello, " + this.name); 
    } 
} 

這新Speaker類有一些有用的功能:它可以使用的方法speak()輸出有用的信息:

var s = new Speaker() 
s.name = "Sally" 
s.speak() 

執行該的m e留言「你好,莎莉」。不幸的是,您不希望使用此功能的新對象(如s),您希望現有對象(myobj)擁有它。這裏是你如何做到這一點:

myobj.speak = s.speak 

現在,當我執行此:

myobj.speak() 

我看到 「你好,弗雷德」 的消息。

總結:創建一個對象,做你想做的。將所有方法(以及任何助手變量)複製到新對象中。除了繼承的一些不尋常的用途,這將使你的新對象按照需要行事。

2

如果你想使用它們的特定方法,你可以使用apply/call。

或者您可以複製您的自定義對象的方法。

function Object1() { 
    this.aValue = "10"; 
} 

function CustomObject() { 
    this.customValue = "6"; 
} 

function convertToCustom(obj) { 
    var custom = new CustomObject(); 
    for(var key in obj) { 
    custom[key] = obj[key]; 
    } 
    return custom; 
} 

var obj = new Object1(); 
var custom = convertToCustom(obj); 

console.log(custom.customValue); // <- 6 
console.log(custom.aValue);  // <- 10 
0

爲補充傑里米的答案,你可以使用的Object.create,而不是與直接播放。你還需要一個「擴展」功能。

因此,鑑於傑里米的例子,你可以有這樣的事情:

var obj = { 
name : "Jeremy" 
}; 


function CustomType() { 
} 

CustomType.prototype.init = function(){ 
    this.name = this.name || "someValue"; 
    this.greeting = "Hi"; 
    return this; //let's make it fluent 
} 

CustomType.prototype.sayHi = function() { 
    console.log(this.greeting + ", " + this.name); 
}; 

function extend(obj, props) { 
    for(prop in props) { 
     if(props.hasOwnProperty(prop)) { 
      obj[prop] = props[prop]; 
     } 
    } 
    return obj; //let's make it fluent 
} 

obj = extend(Object.create(CustomType.prototype), obj).init(); 

obj.sayHi(); 
1

如果您不需要構造函數,你可以做:

Object.assign(new CustomType, {});