2013-03-30 67 views
1
var MyClass = (function() { 

    var _data; 

    var cls = function() { }; 

    cls.prototype = { 

     init: function(data){ 
      _data = data; 
     } 
    }; 

    cls.foo = _data; 
    cls.bar = 1; 

    return cls; 
})(); 

var someData = { foo: true }; 

var cls = new MyClass(); 
cls.init(someData); 

console.log(MyClass.foo); //undefined 
console.log(MyClass.bar); //1 

爲什麼不是MyClass.foo這裏設置?它是在我上面運行的init()方法中設置的。因此它應該返回{ foo: true }。我錯過了什麼?關閉以外的訪問變量

+2

你設置'CLS。 '_data'有數據之前,foo = _data'。 – elclanrs

回答

2

cls.foo = _data;將不會別名cls.foo_data。它只是複製_data的值,該值在執行時爲undefined

要麼設置cls.fooinit,或(更好),使cls.foo動態,爲function() { return _data; }

+0

更好的是,使'cls.foo'成爲訪問器屬性 - 'Object.defineProperty(cls,「foo」,{get:function(){return _data;}})'。 –

+0

@AaditMShah我想要一個跨瀏覽器的解決方案,雖然:) – Johan

+0

@AaditMShah:確實。謝謝。我對JS 1.8.5還沒那麼熟悉。 – Amadan

1

我相信這是你想要什麼:

function MyClass() { } 

MyClass.prototype.init = function (data) { 
    MyClass.foo = data; 
}; 

MyClass.bar = 1; 

現在預期它會工作:

var someData = { foo: true }; 

var cls = new MyClass; 
cls.init(someData); 

console.log(MyClass.foo); 
console.log(MyClass.bar); 

在這裏看到演示:http://jsfiddle.net/gTDZk/