使用Object.create()将函数与原型上的属性合并

时间:2013-10-31 22:49:18

标签: javascript

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 

我想知道使用上面的funcstuffret添加到Object.create()原型的正确语法。

http://jsfiddle.net/Qy9Vm/

2 个答案:

答案 0 :(得分: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,{ {1}} ......等等。

答案 1 :(得分:1)

  

我想知道使用上面的Object.create()将funcstuff添加到ret原型的正确语法。

由于您提供给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
});