【发布时间】:2015-05-21 23:58:39
【问题描述】:
我希望能够创建一个看起来像传递给它的对象的类,并向该对象添加新方法。
这是我目前所拥有的:
Node = function(data) {
Node = data;
Node.constructor.prototype = new data.constructor();
Node.constructor.prototype.testProp = "Hello!";
return Node;
};
node = Node('abc');
console.log(node); // abc
console.log(node.testProp); // Hello!
var testArray = [];
testArray.push(node);
console.log(testArray); // ['abc']
这个实现有什么问题?
Node 类在此示例中看起来像一个字符串,但现在每个字符串都有一个 testProp 属性。
console.log(node.testProp) // 'Hello!'
console.log("something".testProp) // 'Hello!'
我的问题:
我应该如何实现一个行为类似于在构造函数中传递的对象而不影响同一类的所有其他对象的类?
为什么?
我问这个的原因是我希望元素数据 (String, Number, Array, Object, etc) 可以在不使用任何方法或道具的情况下访问,例如console.log(Node.value);,相反,我只想使用console.log(Node);
谢谢!
【问题讨论】:
-
好吧,在您的示例中,您传递的是 primitive 值,而不是对象。您不能“扩展”原始值而不影响同一类型的所有原始值。如果您使用实际对象,您可能只想直接 将新属性分配给它,而不是它的原型。但我想我真的不明白“看起来像对象的类”是什么意思。是否要动态创建子类?
-
@FelixKling 感谢 Felix 的澄清,您是否看到任何解决方法可以使原始值的实现成为可能?
-
@FelixKling 我想要的是能够 console.log(node) 和输出例如是一个字符串,并且在数组中表现相同。
-
如果您想控制如何将任何对象转换为原始值,您可以覆盖其
toString和valueOf方法。有关示例,请参见 stackoverflow.com/questions/27989285/…。 -
这只是显示 DOM 元素的 HTML 表示的控制台。这是特定于浏览器的行为,与 JavaScript 或 jQuery 无关。这适用于每个 DOM 元素,只需尝试
console.log(document.body)。
标签: javascript string oop constructor prototype