2014-03-05 33 views
0

我有一個類(構造函數)User如何在構造函數的新創建的onjects上定義getter函數?

function User(id) { 
    this._id = id; 
} 

從我做我的對象,如user

var user = new User(9); 

我想寫這個user對象getter函數,但實際上沒有特別的它,而是由我的構造函數User創建的所有對象。

不過,我覺得這應該工作,但它不是

Object.defineProperty(User, 'id', { 
    get: function() { 
     console.info('Using getter..'); 
     return this._id; 
    }, 
    // set:function(val) { alert('set value'); } 
}); 

var user = new User(9); 

console.info(user.id); // gives undefined 

我想這是因爲User是一個構造函數,而不是實際的對象,定義getter函數那樣不起作用。還有其他可能嗎?

+1

您設置它的方式,_id屬性是公共的並且可以訪問。添加一個getter函數是多餘的。 – MjrKusanagi

+0

有關原型的更多信息,請訪問http://stackoverflow.com/a/16063711/1641941鏈接到可模擬受保護成員的模式最後 – HMR

回答

1

想通了。只需將構造函數本身中的getter定義從我可以正確使用的位置移動到this

function User(id) { 
    this._id = id; 

    Object.defineProperty(this, 'id', { 
     get: function() { 
      console.info('Using getter..'); 
      return this._id; 
     }, 
     // set:function(val) { alert('set value'); } 
    }); 
} 
0

您設置的方式_id屬性是公開的並且可以訪問。添加一個getter函數是多餘的。

要正確地隱藏內部變量爲對象,您需要:

function User(id) { 
    var _id = id; 

    this.getID = function(){ 
     return _id; 
    } 
} 

如果不正確地隱藏變量,何苦寫一個getter;你現在的方式,你可以做console.info((new User(12))._id)。如果您將一個變量附加到this指針,它將使其成爲該類的公共屬性。