如何在JavaScript中向自定义类型添加方法

如何在JavaScript中向自定义类型添加方法,javascript,Javascript,如果标题措词不当,请道歉 我基本上要做的是创建一个自定义类型,该类型上有方法。它的目的是作为泛型类型,因此它可以接受字符串、int等 const foo = new CustomType('value') console.log(foo) // 'value' console.log(foo + 'hello') // 'valuehello' foo.method() // Do something const bar = new CustomType([]) bar.push('foo

如果标题措词不当,请道歉

我基本上要做的是创建一个自定义类型,该类型上有方法。它的目的是作为泛型类型,因此它可以接受
字符串
int

const foo = new CustomType('value')

console.log(foo) // 'value'
console.log(foo + 'hello') // 'valuehello'
foo.method() // Do something

const bar = new CustomType([])

bar.push('foobar')
如果我使用一个类来存储值,我就不能对它进行操作

class CustomType {
  constructor(value) {
    this.value = value
  }

  method() {}
}

const foo = new CustomType('value')
console.log(foo + 'hello') // [object Object]hello"

与使用
new Array()
new String()

类似,代码几乎不可能产生所需的结果。当您执行
console.log(foo)
时,为了使
'value'
(并且只有
'value'
)被记录,
foo
只能包含确切的字符串
'value'
。它甚至不能包装在字符串(或自定义字符串)对象中

console.log(新字符串('value'))
您尝试使用原型来完成的工作是可能的(这是
由JS中的类模仿)

强制覆盖

您实际解释的内容听起来很像在javascript中重写强制规则,该规则定义了自定义类型如何与另一个基元类型一起工作。这也是可能的

阅读更多信息

如果您试图覆盖浏览器对“toString()”对象的默认方法。这是不可能的。不过,在nodejs中有一种方法可以做到这一点。Node在内部调用Node js的根对象原型中可用的对象上的“inspect”。这是可以覆盖的


问题是什么?如果我使用类,
foo+'hello'
不会导致
valuehello
重写toString方法。我希望能够直接在构造函数中返回类型-可能吗?@DavidAlsh不,不可能。如果将该值设置为字符串,则它不再是自定义类型。这会产生误导。我们可以通过改变自定义类型对象原型来实现同样的结果,这是JS最强大的功能之一。我的
toString
method
方法将自定义方法放在
CustomType
的原型上。这一点也不误导。您使用
函数
语法将方法放在原型上并分配给
.prototype
对象的方法与我所做的完全相同。我正在谈论您的第二个语句。您已经声明,似乎更改本机原型是唯一的选择。当您可以清楚地修改自定义类型的原型时。在定义了实际的自定义类之后修改自定义类型的原型并没有真正的帮助,因为您可以在定义该类时将所需的方法放在该类上,而不涉及任何变异。答案中的最后一个片段根本没有使用任何新类,因为修改内置原型是在使用OP的原始代码逐字记录的同时记录
'value'
的唯一方法。如果您尝试在那里使用类,则
控制台.log(foo)
将记录类对象,而不是
的“值”
字符串。“在定义实际自定义类之后修改自定义类型的原型并没有真正的帮助”
function CustomType(param) {
  this.default = param;
}

CustomType.prototype.toString = function(postfix = "") {
  return this.default + postfix;
};

CustomType.prototype.doSomething = function() {
  console.log("I am doing something")
};


let customTypedObject = new CustomType("value"); 
console.log(customTypedObject.toString());// "value
console.log(customTypedObject.toString("hello")); // "valuehello


//Prototypal function inherited
customTypedObject.doSomething() //"I am doing something"
function CustomType(param) {
  this.default = param;
}
CustomType.prototype.valueOf = function() {
  return this.default;
}

let customTypedObject = new CustomType("value")
console.log(customTypedObject + "hello"); //valuehello
//Works on NodeJS code (not in browser)
CustomType.prototype.inspect = function() {
  return this.default;
};

let customTypedObject = new CustomType("value")
console.log(customTypedObject); // "value"