2013-10-31 54 views
1
var blah = (function(){ 

    function ret(){ 

    } 

    ret.prototype = Object.create(Object.prototype, { 
     getone: { 
      get: function() { return 1; } 
     }, 
     funcstuff: function(){ console.log('funcstuff'); } 
    }); 

    return ret; 

})(); 

var b = new blah(); 

console.log(b.getone); // 1 

b.funcstuff(); // Uncaught TypeError: Property 'funcstuff' 
       // of object #<Object> is not a function 

我想知道正確的語法用於添加funcstuff上述使用Object.create()ret原型。使用的Object.create()的原型合併功能與特性

http://jsfiddle.net/Qy9Vm/

+3

你真的想解決什麼問題?爲什麼不只是將方法添加到blah.prototype?你爲什麼需要使用'Object.create()'來添加方法到原型? – jfriend00

+0

@ jfriend00因爲我想添加很多屬性和方法。我不想在定義方法後執行'Object.defineProperty()'foreach屬性。 – Johan

+0

@ jfriend00:不適合'getone'的getter。 –

回答

1

我想知道使用上面的Object.create()向ret原型添加funcstuff的正確語法。

既然你給Object.create對象定義屬性是property descriptor,如果你想funcstuff實際上一個函數,你把它定義爲描述符中value屬性:

ret.prototype = Object.create(Object.prototype, { 
    getone: { 
     get: function() { return 1; } 
    }, 
    funcstuff: {          // changes 
     value: function(){ console.log('funcstuff'); } // changes 
    }             // changes 
}); 
1

我認爲正確的語法是:

var blah = (function(){ 

function ret(){ 

} 

ret.prototype = Object.create(Object.prototype, { 
    getone: { 
     get: function() { return 1; } 
    }, 
    funcstuff: { value: function(){ console.log('funcstuff'); } } 
    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
}); 

return ret; 

})(); 

var b = new blah(); 

console.log(b.getone); // 1 

b.funcstuff(); 

Object.create()不直接受理功能或特性,它需要一個屬性描述符這本身是有標準的屬性的對象,可以設置爲configurable,enumerable等。

+0

對不起@Sniffer編輯。我錯誤地做了這件事,然後試圖把它恢復原樣。 – jfriend00

+0

@ jfriend00不用擔心,謝謝。 –