爲了方便,大部分人都是直接使用字面量來初始化對象,咱們知道原型對象是建立函數自帶的,若是使用字面量來初始化至關於重寫原型對象,這樣就會致使一些以下問題。函數
問題:
重寫以後,原型對象的constructor不在指向原型對象所在的函數prototype
function demo1 () { } demo1.prototype = { show: function() {console.log('execute success!')} } demo1.prototype.constructor再也不指向demo1
既然有了問題,那天然有解決問題的方法code
方法就是讓構造函數從新指向原先得對象 function demo1 () {} demo1.prototype = { constructor: demo1, show: function() {console.log('execute success!')} }
可是這樣寫又有了新問題,[[Enumerable]]默認是true,而原先的構造函數默認是false,這時候咱們能夠修改對象的屬性,修改對象的屬性天然要用到強大的defineProperty啦對象
function demo1 () {} demo1.prototype = { show: function() {console.log('execute success!')} } Object.defineProperty(demo1.prototype, 'constructor', { enumerable: false, value: demo1 })
好啦,大功告成,就是這樣啦原型