2017-06-19 31 views
0
var vehicle = function(){ 
var type; 
var tyre; 

this.tellTyres = function(){ 
    console.log(type + " has " + tyre + " tyres"); 
}; 

this.__defineGetter__("type", function(){ 
    return type; 
}); 
this.__defineSetter__("type", function(val){ 
    type = val; 
}); 
this.__defineGetter__("tyre", function(){ 
    return tyre; 
}); 
// this.__defineSetter__("tyre", function(val){ 
//  tyre = val; 
// }); 

}; 

var car = new vehicle(); 
car.type = "Car"; 
car.tyre = 4; 

console.log(car.tyre); 

car.tellTyres(); 

我正在瞭解getter和setter。然後我意識到Javascript在設置car.tyre的值時沒有拋出任何錯誤,而沒有其setter方法。當在javascript中設置對象屬性時沒有設置器會發生什麼情況

構造函數之外的car.tyre屬性會發生什麼情況。價值4存儲在哪裏?它是否覆蓋?

+0

哦,console.log輸出「undefined」。呃...爲什麼這樣呢? –

+1

如果你正在學習,請注意,這個特性'__defineGetter__'已被棄用,而使用'Object.defineProperty()' – Agalo

+0

這本書在ECMAScript 3.1中介紹。感謝您告訴...將探討'defineProperty()'。你有什麼線索'defineSetter'方法嗎? –

回答

1

JavaScript比Java對象更像字典。這意味着,你可以設置,只是通過使用屬性訪問運營商.[]得到一個對象的屬性:

var obj = { foo: 'bar' }; 
obj.baz = 17; 
console.log(obj.foo, obj.baz); // logs '"bar" 17' 

這是絕對的罰款。

但是有時候,當某人修改你的對象的屬性時,你想要做些什麼。在這些情況下,您可以定義該屬性(使用Object.defineProperty而不是defineGetterdefineSetter)getter或setter函數:

var obj = { foo: 'bar' }; 
 
Object.defineProperty(obj, 'baz', { 
 
    get: function() { 
 
    console.log('Someone wants to read the property "baz"!'); 
 
    return 34; 
 
    }, 
 
    set: function (value) { 
 
    console.log('You are not allowed to modify the property "baz"!'); 
 
    } 
 
}); 
 

 
obj.baz = 17; // doesn't work 
 
console.log(obj.foo, obj.baz); // logs '"bar" 34'

當你創建一個new vehicle(),將創建一個新的對象,上您可以設置或讀取屬性。你不需要獲得者和制定者。

+0

謝謝。 :)在你寫的最後一行//日誌欄17.它應該是34.直到我運行代碼時,我幾乎感到困惑。無論如何,非常感謝。 –

+0

是的,你是對的。我編輯了答案。 – PeterMader

相關問題