gpt4 book ai didi

javascript - 在 javascript 中强制执行 new 的模式

转载 作者:可可西里 更新时间:2023-11-01 01:50:18 24 4
gpt4 key购买 nike

我一直在阅读 Stoyan Stefanov 的 JavaScript Patterns 一书,其中一种为构造函数强制使用 new 运算符的模式是这样的

function Waffle() {
if (!(this instanceof Waffle)) {
return new Waffle();
}
this.tastes = "yummy";
}
Waffle.prototype.wantAnother = true;

以这种方式编写时,您可以通过以下方式之一调用 Waffle

var first = new Waffle(),
second = Waffle();

我认为这是一个有用的功能,不确定它是否会在未来的 ecma/javascript 版本中实现

我自己想出了一些我认为每次创建构造函数时都可以复制和粘贴的东西

像这样的

function checkInstance (name) {
if (name.constructor.name === undefined) {
return "construct it"
} else {
return false;
}
}

function Waffle() {
var _self = checkInstance.call(this, this);
if (_self === "construct it") {
return new Waffle()
}
this.tastes = "yummy"
}

var waffle = Waffle()
waffle

因此我可以通过 new Waffle 或 Waffle() 调用 Waffle 并且仍然让它返回一个对象

我遇到的问题就在这里

  if (_self === "construct it") {
return new Waffle()
}

我是否可以引用 new Waffle() 而无需引用构造函数的实际名称,这样我就可以每次都复制和粘贴它而不必更改任何内容。这意味着我可以将 Waffle() 保存为变量并执行类似

return new var

我希望我可以使用 this.name 但这在调用它之前也不起作用。

我觉得我不能,但至少想问问这里的一些人,看看是否有可能

再次感谢您的意见和反馈

最佳答案

我有更好的解决方案。这是您当前正在做的:

function Waffle() {
if (!(this instanceof Waffle))
return new Waffle;
this.tastes = "yummy";
}

Waffle.prototype.wantAnother = true;

这种模式并不是很好,因为您将构建新对象的代码与检查是否使用了 new 关键字的代码混合在一起。

我之前提到过你shouldn't use the new keyword in JavaScript因为它破坏了功能特性。相反,让我们创建另一个函数来做同样的事情:

Function.prototype.new = (function () {
return function () {
functor.prototype = this.prototype;
return new functor(this, arguments);
};

function functor(constructor, args) {
return constructor.apply(this, args);
}
}());

此函数允许您创建一个函数的实例,如下所示:

var waffle = Waffle.new();

但是我们根本不想使用new。因此,为了消除它,我们将创建一个包装构造函数的函数,如下所示:

function constructible(constructor) {
function functor() { return Function.new.apply(constructor, arguments); }
functor.prototype = constructor.prototype;
return functor;
}

现在我们可以定义Waffle函数如下:

var Waffle = constructible(function () {
this.tastes = "yummy";
});

Waffle.prototype.wantAnother = true;

现在您可以使用或不使用 new 创建对象:

var first = new Waffle;
var second = Waffle();

注意:constructible 函数非常慢。请改用以下版本的 constructible - 它会快一点:

function constructible(constructor) {
constructor = Function.bind.bind(constructor, null);
function functor() { return new (constructor.apply(null, arguments)); }
functor.prototype = constructor.prototype;
return functor;
}

我个人不会使用这两种方法中的任何一种。我只记得写 new,或者(更有可能)我会按如下方式重组我的代码:

var waffle = {
create: function () {
var waffle = Object.create(this);
waffle.tastes = "yummy";
return waffle;
},
wantAnother: true
};

var first = waffle.create();
var second = waffle.create();

如果您想了解有关此模式的更多信息,请阅读以下答案:https://stackoverflow.com/a/17008403/783743

关于javascript - 在 javascript 中强制执行 new 的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17032749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com