2015-02-07 70 views
0

今天在玩弄一些宠物项目时,我遇到了一些我无法解释的特性。下面是从一个节点REPL日志:不可写的原型属性是否可以被映射?

> foo = Object.create({}, { toString: { value: function() { return 'bob' } } }) 
{} 
> bar = Object.create(foo) 
{} 
> bar.toString() 
'bob' 
> bar.hasOwnProperty('toString') 
false 
> bar.toString = function() { return 'nope' } 
[Function] 
> bar.toString() 
'bob' 

这是我的期望bar.toString将阴影foo.toString,但是这似乎并没有发生。在创建foo时,将toString属性设置为writable: true使其按预期工作。

不能写入的原型属性是否可以被映射?

+0

清晰:需要注意的是任何属性名称不相同,“toString2”或“myProp”,这里不仅仅是“的toString” – dandavis 2015-02-08 00:56:16

+0

的主要问题是非常有用这个问题一样:[从冻结的父对象创建新的对象](http://stackoverflow.com/questions/19698533/creating-new-objects-from-frozen-parent-objects) – 2015-02-08 02:57:32

+0

@ Qantas94Heavy是对的,这个问题应作为副本关闭。感谢您的链接! – 2015-02-08 15:13:36

回答

0

是的,你可以使用Object.defineProperty

Object.defineProperty(bar, 'toString', { 
    configurable: true, // optional 
    writable: true,  // optional 
    value: function() { return 'nope'; } 
});