【发布时间】:2012-10-29 08:20:09
【问题描述】:
我在尝试在基础对象上利用 Object.defineProperty() 时遇到了挂断。我想从该对象继承属性,使用Object.create(),然后在派生对象中定义更多属性(可以从那里继承)。我应该注意,我的目标是 node.js。
这是一个例子:
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() 没有调用它。
- 如何在无需枚举的情况下记录所有属性?
- 这是实现继承的有效方式吗?
编辑:
- node.js 的库中是否有另一个函数可以完成这项工作并记录继承的属性?
【问题讨论】:
-
对于初学者来说,
console的实现是特定于浏览器的。您真的不能依赖它以相同的方式运行,浏览器到浏览器,因为每个供应商都在做一些与非标准完全不同的事情。当你在 Chrome 开发工具中console.log(object);时,你会得到一个可扩展的节点树,它具有所有拥有的方法和属性,并且还有proto链,它具有完整的继承堆栈......期待这个每个浏览器都不会发生 - 某些浏览器 (WP7 IE9) 中的程序即使看到window.console也会崩溃,因为它们甚至没有实现。 -
“我应该注意,我的目标是 node.js。”
标签: javascript node.js inheritance