Javascript 行为类似于构造函数参数类型的oop类

Javascript 行为类似于构造函数参数类型的oop类,javascript,string,oop,constructor,prototype,Javascript,String,Oop,Constructor,Prototype,我希望能够创建一个类似于传递给它的对象的类,并向该对象添加新方法 以下是我到目前为止的情况: 这个实现有什么问题 Node类在本示例中看起来像一个字符串,但每个字符串现在都有一个testProp属性 console.log(node.testProp) // 'Hello!' console.log("something".testProp) // 'Hello!' 我的问题: 我应该如何实现一个行为类似于在构造函数中传递的对象的类,而不影响同一类的所有其他对象 为什么? 我问这个问题的原因是

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

以下是我到目前为止的情况:

这个实现有什么问题

Node类在本示例中看起来像一个字符串,但每个字符串现在都有一个testProp属性

console.log(node.testProp) // 'Hello!'
console.log("something".testProp) // 'Hello!'
我的问题:

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

为什么?

我问这个问题的原因是,我希望元素数据字符串、数字、数组、对象等可以在不使用任何方法或道具的情况下访问,例如console.logNode.value;,相反,我只想使用console.logNode


谢谢

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

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进行了变异,那么您就对test进行了变异:

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

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

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进行了变异,那么您就对test进行了变异:

proto.name='changed';
console.log(test);//{testProp: "Hello!", name: "change"}
全球范围内的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!
全球范围内的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!

在您的示例中,您传递的是一个基本值,而不是一个对象。如果不影响相同类型的所有基本体,则无法扩展基本体值。如果使用实际对象,您可能只想将新特性直接指定给它,而不是它的原型。但是我想我真的不明白这个对象是什么样的类。您想动态创建子类吗?@FelixKling感谢您对Felix的澄清,您看到了任何可以使原语值实现的解决方法吗?@FelixKling我想要的是能够console.lognode,并且输出为字符串,例如,如果您想控制任何对象如何转换为基元值,可以覆盖其toString和valueOf方法。请参见示例。这只是显示DOM元素HTML表示形式的控制台。这是特定于浏览器的行为,与JavaScript或jQuery无关。这适用于每个DOM元素,只需尝试console.logdocument.body.Well,在您的示例中,您传递的是一个基本值,而不是一个对象。如果不影响相同类型的所有基本体,则无法扩展基本体值。如果使用实际对象,您可能只想将新特性直接指定给它,而不是它的原型。但是我想我真的不明白这个对象是什么样的类。您想动态创建子类吗?@FelixKling感谢您对Felix的澄清,您看到了任何可以使原语值实现的解决方法吗?@FelixKling我想要的是能够console.lognode,并且输出为字符串,例如,如果您想控制任何对象如何转换为基元值,可以覆盖其toString和valueOf方法。请参见示例。这只是显示DOM元素HTML表示形式的控制台。这是特定于浏览器的行为,与JavaScript或jQuery无关。这适用于每个DOM元素,只需尝试console.logdocument.body。谢谢您的帮助,但我希望能够使用console.logn来完成。您知道如何在Node.js?@KauêGimenes中实现这一点,它可能适用于全局对象。尝试将窗口替换为全局。感谢您的帮助,但我希望能够使用console.logn完成此操作。您知道如何在Node.js?@KauêGimenes中完成此操作,它可能与全局对象一起工作。尝试将窗口替换为全局窗口。