2015-09-28 78 views
0

我使用的是簡單的類機制:如何在JavaScript中的類工廠中設置類的名稱?

function define(SuperClass, name, proto) 
{ 
    let ProtoFn = function(){}; 
    ProtoFn.prototype = SuperClass.prototype; 
    let protoObj = new ProtoFn; 

    var NewClass = function() 
    { 
     this.construct.apply(this, arguments); 
    }; 
    _.extend(protoObj, proto, 
     { 
      constructor: NewClass, 
      _class: NewClass, 
      _parent: SuperClass 
     }); 
    NewClass.prototype = protoObj; 
    NewClass.className = name; 
    NewClass.define = define.bind(null, NewClass); 

    return NewClass; 
} 

使用:

let UserModel = Model.define('UserModel', { /* UserModel proto */ }); 
let john = new UserModel(/* blabla */); 

所有權利。但是當我在Web Developer Tools中登錄對象時,我看到「>NewClass {...}」。因爲方法「define」中的變量被稱爲「NewClass」。我想在控制檯中看到不同的類名。我怎樣才能做到這一點?

我的eval通過新功能

  1. 試圖

    (姓名,function ${name}{ /* code */
  2. protoObj.constructor = {名稱:名稱}
  3. 令O = {}; o [name] = function(){...};讓我們的NewClass = O [名]
  4. Object.defineProperty(的NewClass, '名',{得到...
  5. NewClass.name =名稱; //拋出錯誤

PS對不起,我的英語

+0

如果我得到你的問題的權利,這可能是答案http://stackoverflow.com/questions/9803947/create-object-from-string – halfzebra

+0

不,我說的是:http:// ftp。 faiwer.ru/img_28_09_14:58:48_8ef23be22f4.png。我想看到「> A」而不是「NewClass」 – faiwer

+1

不是我說你*應該*使用它,但出於興趣,爲什麼'eval'沒有工作? 'var NewClass = eval(「(function」+ name +「(){})」);'應該可以正常工作。 [實施例](http://jsfiddle.net/n9jjvsnw/)。另外,你在你的例子中傳錯了你的參數 – CodingIntrigue

回答

1

您可以使用函數構造函數創建一個新的對象,並給它一個名字:

var NewClass = new Function(
    "return function " + name + "(){ }" 
)(); 

JsFiddle Example

+0

好。你的權利,我以前使用過錯誤的參數。可能是沒有eval的存在變體?爲了生產? – faiwer

相關問題