2012-09-21 22 views
4

讓我們用一個例子來解釋這個問題。我有一個文本框。文本框(每個文本框)都有一個名爲'value'的屬性。我想搭上那textbox.value和comeup以及 新東西。當文本框中的文本是'ranjan'時,則textbox.VALUE屬性返回'ranjan'。現在我想覆蓋這個,這樣當你輸入textbox.VALUE時,你會得到另一種說法,比如RaNjAn或Ranjan先生等等。Javascript - 覆蓋物體內的屬性(不是方法)

我們可以使用Object.PROTOTYPE屬性來覆蓋方法。但是我們怎樣才能爲對象內部的非函數對象做到這一點,例如這種情況下的'value'屬性。

如果我需要使問題更清楚,請提及。

Regards - Ranjan。

+1

現在大家都知道你的名字:) –

+0

你可能會在[MDN:使用對象,獲取/設置器](https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects) 。但是,並非所有瀏覽器都能正常工作。 – DCoder

+0

:(這是一般信息。 –

回答

6

您可以使用Object.defineProperty

如果你有,你需要獲得一個元素的值作爲Mr. <value>例如如果你的元素定義自定義屬性,那麼這種做法將是有益的。重寫標準屬性可能不是一個好主意。

演示

代碼

var foo = document.getElementById('foo'); 

Object.defineProperty(foo, "xvalue", { 
    get: function() { 
     return 'Mr. ' + foo.value; 
    }, 
    set: function(_newValue) { 
     foo.value = _newValue; 
    } 
}); 

foo.xvalue = 'Hello'; 

alert(foo.xvalue); 
1

你所試圖做的是所謂的增強型。在javscript中有很多類型的東西,例如對象類型,數組類型等。

您可以使用原型來擴充這些內置類型,例如,添加一個可以在任何對象上調用的新方法是類型的數組:

Array.prototype.myNewMethod = function() { 
    //the method logic 
} 

然後,你可以打電話給你的方法的任何陣列上:

[0,1,2].myNewMethod(); 

沒有在JavaScript中沒有輸入類型,DOM元素被歸類爲對象。但你可以傑裏 - 鑽機的東西在一起,那種做你需要什麼,這樣

Object.prototype.changeValue = function(el) { 
    if (el.tagName === "INPUT") { 
     return "Mr " + el.value; 
    } 
} 


var testEl = document.getElementById("test"); 
document.write(testEl.changeValue(testEl)) 

配合使用這個文本框:

<input id="test" value="Dan" /> 

然後你會得到輸出「先生丹」

然而,這不是很大,它只是爲了說明這一點,是剛剛的東西,讓你開始...

我做a fiddle這樣可以起到一個圓與它

+0

這又是一個解決方法。您需要調用textbox.changeValue()更改該值。我想這是不可能做到這一點的。 –

+0

是的,正如我所說,這不是很好;) – danwellman

1

您可以重新聲明價值,但它沒有什麼好處;)

這個例子會怎麼做,如果測試是一個文本框

var input = document.getElementById("test"); 

Object.defineProperty(input, "value", { 
    get : function() { 
     return "'" + this["value"] + "'"; 
    }, 
    set : function (val) { 
     this["value"] = val; 
    } 
}); 

input.value = "Hello World"; 
alert(input.value); 

不幸的是,「這一點。值」將引用吸氣引起無限遞歸。

一旦重新定義,原來的值將不再存在,因此你會殘廢元素對象。

至少據我已經能夠測試。