2013-10-31 22 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不用担心,谢谢。 –