2012-11-09 48 views
6

我在尝试在基础对象上利用Object.defineProperty()时遇到挂断。我想从该对象继承属性,使用Object.create(),然后在派生对象中定义更多属性(可能从此继承)。我应该注意到,我正在node.js上实现这个目标。为什么console.log()不显示Object.create的继承属性?

下面是一个例子:

var Base = {}; 

Object.defineProperty(Base, 'prop1', { 
    enumerable:true, 
    get:function(){ return 'prop1 value';} 
}); 

Object.defineProperty(Base, 'prop2', { 
    enumerable:true, 
    value : 'prop 2 value' 
}); 

Object.defineProperty(Base, 'create', { 
    value:function(){ 
     return Object.create(Base); 
    } 
}); 

console.log(Base); 

var derived = Base.create(); 

Object.defineProperty(derived, 'prop3', { 
    enumerable:true, 
    value:'prop 3 value' 
}); 

console.log(derived); 

哪个输出以下:

{ prop1: [Getter], prop2: 'prop 2 value' } 
{ prop3: 'prop 3 value' } 

我认为的console.log()将枚举继承的属性,以及我定义的属性prop3在派生的对象上。看起来它不会查找以这种方式定义的属性的原型层次结构。那是对的吗?

我看着重写了我的对象的toString()方法,但似乎console.log()不会调用它。

  1. 如何获取记录的所有属性,而不必通过它们进行枚举?
  2. 这是实现继承的有效方法吗?

编辑:

  1. 是否有node.js的图书馆其他功能,将做的工作和日志继承属性?
+1

对于懒:http://jsfiddle.net/ aDrjA/1/ –

+1

对于初学者来说,'console'的实现是针对浏览器的。你真的不能依靠它来运行浏览器,因为每个供应商都在做与非标准完全不同的事情。当你在Chrome开发工具中使用console.log(object)的时候,你会得到一个可扩展的节点树,它拥有所有的方法和属性,并且还有'proto'链,它具有完整的继承栈......在每个浏览器中都会遇到这种情况 - 即使看到“window.console”,某些浏览器(WP7 IE9)中的程序也会崩溃,因为它们甚至没有实现。 – Norguard

+1

***“我应该注意到我正在使用node.js。”*** –

回答

1

萤火虫确实登录继承的属性:

enter image description here

,而Chrome浏览器为您提供了一个树视图,其中包括继承属性:

enter image description here

+0

@dwerner Chrome提供了一个树形视图。 'console.log'是特定于实现的。看来Node.js决定只记录自己的属性。当然,这并不意味着该对象不会继承其他两个属性。 –

4

可以使用console.dir()如有可用

console.dir(derived) 

,它会显示__proto__对象

编辑对你对象的继承属性:似乎没有出现在节点虽然

+0

也很高兴知道有关console.dir()的感谢。我只是不确定我想依靠'__proto__'。 – dwerner