[英]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.