2016-11-11 62 views
0

我在下面的類時,我打電話printData我得到this.collection是未定義的。如何從JavaScript中的原型訪問對象屬性?

如何從printData()中的原型訪問this.collection?或者我需要改變班級結構。實際上,對象返回實體返回層次結構中的對象的函數。

在此先感謝!

樣品等級:

var DbProvider = (function() { 
    function DbProvider(db) { 
     var that = this; // create a reference to "this" object 
     that.collection = db; 
    } 
    DbProvider.prototype.create = function() { 
     return { 
      action: function() { 
       var y = { 
        printData: function() { 
         alert('Hello ' + this.collection.Name); 
        } 
       }; 
       return y; 
      } 
     }; 
    }; 
    return DbProvider; 
})(); 

用法:

var a = new DbProvider({ "Name": "John" }); 
a.create().action().printData(); 
+0

是否可以使用ES6類? – MayorMonty

+0

在你的代碼中,你創建一個'this'的引用,標記在'that'中。你可以使用'that'來代替(雙關語) – MayorMonty

+0

沒有那個對象是不可訪問的。也有可能用ES5創建普通的JavaScript? –

回答

1

你可以保存this參考,並將其綁定到printData功能

var DbProvider = (function() { 
 
    function DbProvider(db) { 
 
     var that = this; // create a reference to "this" object 
 
     that.collection = db; 
 
    } 
 
    DbProvider.prototype.create = function() { 
 
     var self = this; 
 
     return { 
 
      action: function() { 
 
       var y = { 
 
        printData: function() { 
 
         alert('Hello ' + this.collection.Name); 
 
        }.bind(self) 
 
       }; 
 
       return y; 
 
      } 
 
     }; 
 
    }; 
 
    return DbProvider; 
 
})(); 
 

 
var a = new DbProvider({ "Name": "John" }); 
 
a.create().action().printData();

或者你可以重構了一下,移動thatDbProvider外範圍和使用thatprintData

var DbProvider = (function() { 
 
    var that; 
 
    function DbProvider(db) { 
 
     that = this; // create a reference to "this" object 
 
     that.collection = db; 
 
    } 
 
    DbProvider.prototype.create = function() { 
 
     return { 
 
      action: function() { 
 
       var y = { 
 
        printData: function() { 
 
         alert('Hello ' + that.collection.Name); 
 
        } 
 
       }; 
 
       return y; 
 
      } 
 
     }; 
 
    }; 
 
    return DbProvider; 
 
})(); 
 

 
var a = new DbProvider({ "Name": "John" }); 
 
a.create().action().printData();

1

保持ES5語法和調用結構的解決辦法是:

var DbProvider = (function() { 
    function DbProvider(db) { 
     var that = this; // create a reference to "this" object 
     that.collection = db; 
    } 
    DbProvider.prototype.create = function() { 
     var that = this; 
     return { 
      action: function() { 
       var y = { 
        printData: function() { 
         console.log('Hello ' + that.collection.Name); 
        } 
       }; 
       return y; 
      } 
     }; 
    }; 
    return DbProvider; 
})(); 

肯定不是優雅,但它的工作原理:)

如果您不想更改結構,如果將功能更改爲arrow functions,則可以實現此行爲。

var DbProvider = (function() { 
    function DbProvider(db) { 
     var that = this; // create a reference to "this" object 
     that.collection = db; 
    } 
    DbProvider.prototype.create = function() { 
     return { 
      action:() => { 
       var y = { 
        printData:() => { 
         alert('Hello ' + this.collection.Name); 
        } 
       }; 
       return y; 
      } 
     }; 
    }; 
    return DbProvider; 
})(); 

你創建這個「類」的方式絕對不是標準。讓我知道你是否想要一個如何更好地構造它的例子。

+0

感謝您的回覆。但我正在尋找ES5解決方案?在ES5中可以實現嗎?另外請指教我是否可以在不改變最終調用者部分(如dbProvider.create()。action()。printData(); –

1

只需要正確地跟蹤這個指針,這樣

var DbProvider = (function() { 
 
    function DbProvider(db) { 
 
    this.collection = db; 
 
    } 
 
    DbProvider.prototype.create = function() { 
 
    var self = this; 
 
    return { 
 
     action: function() { 
 
     var y = { 
 
      printData: function() { 
 
      alert('Hello ' + self.collection.Name); 
 
      } 
 
     }; 
 
     return y; 
 
     } 
 
    }; 
 
    }; 
 
    return DbProvider; 
 
})(); 
 

 

 

 
let dbProvider = new DbProvider({ 
 
    Name: "test" 
 
}); 
 
dbProvider.create().action().printData();

+0

感謝您的回覆。但我正在尋找ES5解決方案?是否有可能在ES5 /簡單的JavaScript中實現? - –

+0

已更新 - 無es6課程 – skav