2010-11-11 86 views
4

我有以下代碼:的JavaScript擴展對象的問題

this.myObject = { 
    key1: "val1", 
    key2: "val2" 
} 

this.aMethod = function (newObject) { 
    ... 

在這裏,我希望有一個新的對象(可能是從this.myObject繼承),它包含在this.myObject無論是在newObject也一切,領域newObject應覆蓋已存在的字段this.myObject

我該如何做?

這個想法是,this.myObject提供了一些默認值 - 但方法的用戶可以覆蓋這些值。我也接受批評這種總體「模式」的觀點。謝謝。

+0

在未來,而不是問你的問題在「代碼評論「,在問題文本中提問 - 人們可以將問題看作僅包含文本,並將其視爲」不是真正的問題「。 – Oded 2010-11-11 13:14:12

+0

修復它爲雅! – 2010-11-11 13:20:02

+0

這是全局代碼還是功能代碼? – 2010-11-11 13:22:44

回答

5
SomeObject.prototype.someMethod = function() { 

    this.myObject = { key1: 1, key2: 2 }; 

    this.aMethod = function (o) { 
     var newObject = object(this.myObject); 

     for (var prop in o) { 
      if (o.hasOwnProperty(prop)) { 
       newObject[prop] = o[prop]; 
      } 
     } 

     // Now newObject contains all properties from the passed in object 
     // and also inherits all properties from myObject 

    }; 

}; 

注意:我使用@ Marco的答案中的對象函數。

+0

Thanks - Ill接受你在這方面與我一起工作的答案。這比單純使用JQuery擴展函數更受歡迎嗎? – bba 2010-11-11 14:29:04

+1

@bba我還沒有看過那個特定的jQuery函數,但總的來說,我總是比我自己的代碼更喜歡jQuery,因爲jQuery已經過全面測試並且跨瀏覽器。 – 2010-11-11 14:37:56

0

本應該做的工作:

this.aMethod = function(newObject){ 
    combinedObject = {}; 
    for(key in this.myObject){ 
    combinedObject[key] = this.myObject[key]; 
    } 
    for(key in newObject){ 
    combinedObject[key] = newObject[key]; 
    } 
    return combinedObject; 
} 

或者,如果你使用jQuery,在一條線:

return $.extend({},this.myObject,newObject); 
+0

由於OP的代碼是功能代碼,因此aMethod函數內部的這個值和它外部的這個值並不是指同一個東西,ergo,this.myObject不會給你代碼中早先定義的對象。 – 2010-11-11 13:40:06

+0

Sime - 我需要做些什麼:var self = this,在aMethod之外,然後使用self.myObject? – bba 2010-11-11 13:44:41

+0

@bba這樣做。但是,這個約定是var that = this;然後that.myObject。 – 2010-11-11 13:53:49

5

因此談到道格拉斯·克羅克福德:

function object (o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
} 

有字面上有幾十種方式來做到這一點。 Yahoo Theater的視頻和Javascript: The Good PartsObject Oriented Javascript的書籍探索了一些權衡。許多JavaScript庫實現了一個簡單的「類似」的繼承模式,但它只是整個蛋糕中的一小部分。

0

如果這是你要找的東西:

var Base = function() { 
    this.foo = "bar"; 
}; 

var MyClass = new Class({ extends: Base }, function() { 

    this.myMethod = function() { 
     return this.foo; // bar 
    } 

}); 

檢查了這一點:精縮2KB簡約庫,就可以使用,https://github.com/haroldiedema/joii/