繁体   English   中英

概念:在JavaScript中创建一个类似于构造函数的函数

[英]Concept: Creating a function that acts like a constructor in JavaScript

我们想要一个可以将方法应用于输入对象的函数。

首先,我们创建一个函数。

$ = function () { /* Constructor Code */ };

然后,我们添加一个方法。 例如, type 该方法将使用此功能:

function () { return toString.call(this).slice(8, -1);

最后,我们测试该函数以查看是否获得正确的输出。 这是我们想要看到的:

$("test"); // Output: "test"
$("test").type(); // Output: "String"
$(document.body).type(); // Output: "HTMLBodyElement"

输出应不同于输入的唯一方法是方法的应用。

使用Object.addProperties无效,因为它将输入转换为对象:

$("test").type(); // Output: "Object"

另外,使用与eval相关的方法也将不起作用,因为某些对象无法转换为字符串:

$(document.body).type(); // Error: Can't convert element to string!

将对象的属性手动添加到该对象也是如此。

$("test").type(); // Can't apply function to literal string!

现在的问题是,我们怎么

一种方法是将方法应用于输入的原始版本。

这是通过Object.assign完成的。 这是一个快速实现:

$ = function (_) {
  return Object.assign(_, {
    type: function () { return toString.call(this).slice(8, -1) }
  })
};

这是输出:

$("test").type() // Output: "String"
$(document.body).type() // Output: "Date"

我们还可以将变量用作方法列表,这将返回相同的输出:

$ = function (_) {
  return Object.assign(_, $.methods)
};

$.methods = ({
  type: function () { return toString.call(this).slice(8, -1) }
});

但是,这些解决方案都需要valueOf来检索某些对象的原始输入:

$("test"); // Returns a "pseudo-string"
$("test").valueOf(); // Output: "test"

由于valueOf可能是不安全的,因此我们可以向方法列表中添加属性以获取原始输入:

$ = function (_) {
  return Object.assign(_, ({
    type: function () { return toString.call(this).slice(8, -1) }, val: _
  });
};

现在使用val将返回原始输出,而无需调用函数:

$("test").val // Output: "test"
$(document.body).val // Output: <body>...</body>

这还不错,但是也许有一种方法可以使用这些方法返回真正未修改的值?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM