oop类似于构造函数参数类型的类

时间:2015-03-19 00:06:50

标签: javascript string oop constructor prototype

我希望能够创建一个类似于传递给它的对象的类,并向该对象添加新方法。

这是我到目前为止所拥有的:

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类看起来像一个String,但现在每个字符串都有一个testProp属性。

console.log(node.testProp) // 'Hello!'
console.log("something".testProp) // 'Hello!'

我的问题:

我应该如何实现一个类似于在构造函数中传递的对象而不影响同一个类的所有其他对象的类?

为什么?

我之所以这样问是因为我希望可以访问元素数据(字符串,数字,数组,对象等),而无需使用任何方法或道具,例如{{1} },而我只想使用console.log(Node.value);

谢谢!

2 个答案:

答案 0 :(得分:3)

以下内容不适用于基本类型(如字符串和数字),但适用于对象:

node = function(data) {//do not capitalize non constructor functions
  ret = Object.create(data);
  ret.testProp = "Hello!";
  return ret;
};

var proto = {name:'hello'};
test = node(proto);
console.log(test); //{testProp: "Hello!", name: "hello"}
console.log(test.testProp); // Hello!

请注意,如果你改变proto,你会改变测试:

proto.name='changed';
console.log(test);//{testProp: "Hello!", name: "change"}

答案 1 :(得分:3)

全局

上的getter和setter

此解决方案无需“。”但它只适用于全局变量。

var test = {value: "Hello World!"};

Object.defineProperty(window,'node_a', {
  get: function() {return test.value;},
  set: function(newValue) {test.value = newValue;},
  enumerable: true,
  configurable: true
});

function nodeValue() {
  console.log(node_a);
  node_a = "Foo Bar";
  console.log('test.value=' + test.value);
  console.log(node_a);
}

nodeValue();

输出:

Hello World!
test.value=Foo Bar
Foo Bar

toString和valueOf

您可以通过创建toString和valueOf函数将对象转换为字符串或数字。这会让你接近,但是当它没有被字符串作用时,我们仍然会对值进行序列化。

function Node(data) {
  this.data = data;
  this.test = 'world!';
}

Node.prototype.toString = function() {
  return this.data;
};

Node.prototype.valueOf = function() {
  return this.data;
}

var n = new Node('Hello');

console.log(n);
console.log(n+"");
console.log(n.test);

输出

 Node { data="Hello", test="world!", toString=function(), more...}
Hello
world!