Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JavaScript的new与类继承语言的new

new,这玩意儿读起来很顺口,用起来很随性。有时候感觉上它就像个动词。你还在为没对象而发愁吗?new一个呀,对象什么的想new多少就new多少,new就是单身程序猿的福音。现在我们就来说说这个new到底在程序中做了什么事情。
  对,new就是为你创建了一个对象!也许在很多类继承的编程语言中,new就是按照类的定义来创建一个对象。但JavaScript不然,new创建的是一个空对象,自身是不带任何属性的。但是,在它内部有一个属性执行了其构造器的原型。这就相当于指定了这个对象继承自哪个类一样。
  和其它类继承的语言不同,类继承的情况是在new的时候执行,按照类的定义来分配所需的空间,这些空间包括类上定义的成员属性(不包括函数和一些特殊结构)。但是JavaScript的对象并没有直接的内存分配,人家还是个“处”。也许不为对象分配空间在写惯了类继承的人眼里看来很难理解,但JavaScript本身是基于一个动态分配的,所以它可以不用在实例化时为对象分配额外的空间。只要我们需要,随时都可以分配。而构造器原型上的属性会通过原型来连接。我们访问这个本身不带任何属性的对象时,它会从绑定的原型中获取相应属性。但是一旦对这个属性赋值,这个属性就会失去与绑定的原型关联,变成这个实例特有的属性。
  最有一个就是构造函数的问题。类继承的编程语言中,使用“new”时通常都会有相应的构造函数,甚至如果有继承关系,其父类的构造函数也会被执行。在JavaScript中,构造器本身的函数体充当着类似构造函数的作用。但也不完全一致!有个很关键的因素,那就是“继承”。JavaScript并没有类继承的概念,虽然通过使用原型可以继承一些通用属性,但是原型毕竟是一个对象,而不是一个构造器。所以JavaScript原生只支持不带构造函数的继承。要是带了构造函数,我们就不能只通过原型来实现了,必须在一个构造器的函数体中去调用另一个构造函数。因为只有构造器的函数体是会为每次执行“new”时运行的。而且在这个函数体中,我们可能还要做许多准备工作,才能模拟出带构造函数的多级类继承。
  总之,JavaScript的new和类继承编程语言的new,其作用是不同的。说不上谁好谁坏,它们各有优缺点吧。
网名:
34.203.245.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^