Javascript 我可以在不调用构造函数的情况下实例化JSAPI对象吗?
传统观点似乎认为使用JavaScript作为经典语言是不好的:所有专家(如@eric elliott、Douglas Crockford等)都认为,JavaScript的支柱是面向对象的(原型继承)和功能性的,而不是经典的 然而,我们的许多API都使用构造函数,并且在实例化对象时需要使用Javascript 我可以在不调用构造函数的情况下实例化JSAPI对象吗?,javascript,Javascript,传统观点似乎认为使用JavaScript作为经典语言是不好的:所有专家(如@eric elliott、Douglas Crockford等)都认为,JavaScript的支柱是面向对象的(原型继承)和功能性的,而不是经典的 然而,我们的许多API都使用构造函数,并且在实例化对象时需要使用new。例如,如果我想通过AJAX调用获取数据,我必须执行类似于let xhr=new XMLHttpRequest()的操作 那么,在API更新之前/除非API更新之前,我们现在是否还停留在JavaScript
new
。例如,如果我想通过AJAX调用获取数据,我必须执行类似于let xhr=new XMLHttpRequest()
的操作
那么,在API更新之前/除非API更新之前,我们现在是否还停留在JavaScript的经典行为上?或者是否有某种方法可以从我们的代码中删除所有这些
新的
声明,可能是类似于API工厂函数或Object.create(XMLHttpRequest.prototype)
?对象。create
做了完全不同的事情——它被用来创建类的子类。您可以查看更详细的内容,而且ecmascript中似乎没有这样的功能。也许在实现的浏览器中应该有一些黑客,谁知道new
与原型与经典有什么关系呢?我想请@EricElliot帮我回答这个问题,因为他更有经验,但我会尝试一下@FelixKling,new
操作符调用构造函数来创建类的实例:这正是经典继承的定义,除非我遗漏了一个要点。原型继承是无类的@AndrewLi,JS不是一种基于类的语言,new
是JS的“坏部分”之一。@DerekHendersonnew
创建一个从原型派生的实例,并通过调用其上的构造函数来初始化它,这正是原型继承的定义。我们称构造函数和原型的组合为“类”并不重要,它的作用与基于类的语言不同。不,Crockford的观点被许多其他专家忽略了。@DerekHenderson:FWIW,这里是new
的简化(和近似)实现:函数my_new(F,…args){var obj=Object.create(F.prototype);F.apply(obj,args);return obj;}
。当然,您可以自己调用对象。创建(…)
+函数进行初始化,但是为什么呢?:)我还想指出,语言的语法和实际行为并不一定相关。例如,拥有类
语法并不意味着该语言使用“经典”类概念。我认为我们可以同意,创建一个新的“实例”/对象可能需要两部分:继承(object.create(…)
)和初始化。您可以通过Object.assign({x:0,y:0},Object.create(point))
轻松实现这一点。但是如果你有100分,你就得写100遍。此时,您可能会使用(工厂)函数使其可重用。在某种程度上,构造函数也是这样的:一种使初始化逻辑可重用的方法。Idk,也许在原型与经典的争论中我遗漏了一些东西,但总的来说,这对我来说似乎毫无意义。