2014-01-25 60 views
3

我想爲我的所有對象(包括「原始」對象(如字符串和數字))添加一個$ error元素。操作JS原型

我有以下的codepen,只是將這個值(通過函數)添加到Object類。

http://codepen.io/anon/pen/nglbL

爲方便起見,這裏是代碼: -

Object.prototype.setError = function (str) { 
    this.$error = str; 
    this.$errorObj = { }; 
    console.log("value of object is " + this.toString()); 
    console.log("Setting error to " + this.$error); 
}; 
Object.prototype.getError = function() { 
    console.log("error is " + this.$error); 
    console.log("error object is " + this.$errorObj); 
    return this.$error; 
} 
var obj = { 
    "str" : "string me!", 
    "bool" : true, 
    "int" : 1 
} 

obj.str.setError("error"); 

console.log("Retriving error and it is " + obj.str.getError()); 

很顯然,我不明白的原型繼承是如何工作的。

謝謝。

+1

「try ... catch」和「throw」有什麼問題? – Blender

+0

我97%肯定這是由於字符串_literal_和字符串_object_之間存在差異,因爲他在他的代碼中使用了'obj.str'而不是'obj' ... –

+0

真實這裏的問題是你想完成什麼?爲什麼你想讓每個對象都有這些方法?你意識到這會傳播到JavaScript中的所有東西(即數組,函數等),因爲它們的鏈中都有Object.prototype – tkone

回答

2

在JavaScript中,原語被其對象包裝在背景中,這些對象被稱爲「包裝對象」,每次將原語視爲對象時,都會創建新的包裝對象。這個過程是透明的,一個持有字符串基元的變量不保存對一個對象的引用,而是一個字符串值。 包裝對象將無法存活多次使用!所以,不要試圖爲字符串,布爾值和數字定義屬性,這根本行不通。

var a = {}; //this is a common object 
a.test = "abc"; 
console.log(a.test);//will print "abc" 

var b = "zzzz"; //declaring a string primitive 
b.test = "abc"; //trying to add a property to this string, we're treating our primitive as an object 
console.log(b.test);//will print undefined 
+0

好的,當我將obj.str更改爲一個新的String(「string me!」)時,它可以工作。所以,看起來如果我想添加一個$錯誤,我應該改變我的原語到它們的對象。 – user1545858

+0

準確地說,僅僅是因爲你正在實例化一個新的String對象,而不是聲明一個原語。 –