课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
JavaScript编程是前端程序员需要重点掌握的一个编程知识,而今天我们就通过案例分析来了解一下,JavaScript编程原型与原型链的概念及应用。
一、JavaScript中的原型
抛开一切复杂的语法规则,JavaScript的原型系统的实质只有两条:
如果对象都有私有字段[[prototype]],那它就是对象的原型;
读一个属性,如果对象自身没有,则继续访问对象的原型,直到找到或者原型为空为止。
从ES6以来,JavaScript提供了一系列内置函数,以便更直接地访问操纵原型,分别为:
Object.create根据指定的原型创建新对象,原型可以是null;
Object.getPrototypeOf获得一个对象的原型;
Object.setPrototypeOf设置一个对象的原型。
利用这三个方法,我们完全可以抛开基于类的面向对象思维,用原型的概念实现抽象和复用。
二、原型链
JavaScript的每个对象都有一个指向其原型对象的关系链,当试图访问一个属性时,它不仅仅在对象上搜寻,而且还会在它的原型上搜寻,以及原型的原型上搜寻,直到找到属性或者达到此链条的顶端,这就是JavaScript的原型链,用来实现继承的核心逻辑。
函数对象和构造器对象
除过上面对于JavaScript对象的的一般分类方法,还有另一个角度,就是用对象来模拟函数和构造器。
JavaScript中函数对象的定义是:具有[[call]]私有字段的对象;构造器对象的定义是:具有私有字段[[construct]]的对象。
JavaScript用对象模拟函数的设计代替了一般编程语言中的函数,它们可以像其它语言的函数一样被调用、传参。任何宿主只要提供了“具有[[call]]私有字段的对象”,就可以被JavaScript函数调用语法支持。
所以在JavaScript中,任何对象只要实现了[[call]],它就是一个函数对象,可以去作为函数被调用。而如果它能实现[[construct]],它就是一个构造器对象,可以作为构造器被调用。
另外,还有非常重要的一点:用function关键字创建的函数,既是函数(对象),又是构造器(对象)。
对于宿主和内置对象来说,[[call]](作为函数被调用)的行为和[[construct]](作为构造器被调用)的行为可能存在些许差异。而用户使用function语法或者Function构造器创建的对象来说,[[call]]和[[construct]]行为总是一致的。但是,在ES6之后用=>语法创建的函数仅仅是函数,它们无法被当作构造器使用。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。