js继承的方法 如何理解JavaScript的原型和原型链?
如何理解JavaScript的原型和原型链?
JavaScript中的原型和原型链都是实现OOP的手段。OOP在JavaScript中的具体实现如下:
对象是属性的集合。特别地,其值是函数的属性是方法。相似对象的公共属性被提取并聚集在一起形成一个类。这些对象被称为这个类的实例。同样,相似类的公共属性被提取出来,聚集在一起形成一个新类,这个新类是以前类的超类,以前的类是这个类的子类。。多个超类也可以作为子类来聚集一个新的超类,这个过程会一直持续下去,直到出现一个名为Object的类,并且它的超类为Null。
类不仅是公共属性的集合,还是对象工厂。类的实例对象是由该类的构造函数创建的。构造函数负责两件事:
创建一个对象;
初始化对象;
因为方法已经提供了前者的实现,所以构造函数真正需要做的是初始化对象,这分为两件事:
让对象具有由类收集的公共属性;
根据参数,一些对象的属性被特殊化;
对于第二件事,没什么好说的,就是给要初始化的对象添加专门的属性。对于第一件事,你也可以模仿后一种实现方法,但这并不是一个明智的选择,因为这些公共属性的值在大多数情况下是不会改变的。贾瓦斯选择抄本脚本的方法:
将这些公共属性作为属性,并赋予它们默认的属性值,创建一个原型对象;
初始化时,原型对象被赋予要初始化的对象的特殊属性:_ _ proto _ _
也就是说,一个类对应一个原型对象,初始化时用_ _ proto _ _连接实例对象和原型对象。
特殊属性__proto__不仅负责连接实例和原型,还负责连接子类和超类的原型对象,实现类之间的继承关系。这样,一个对象的类原型、超类原型、超类原型就通过__proto__连接起来了。变成一个 "链条 ",称为对象的原型链。是的,一个对象的__proto__属性为null,说明这个对象没有原型链,Object类的原型是这样的。
为了实现通过原型初始化实例的方法,需要在访问对象的属性时相互协作:
读取属性值:先在对象中寻找属性,如果存在则返回其值;否则,在prototype对象中查找,如果存在则返回其值;否则在prototype对象的prototype对象中查找,直到原型链为空,表示该属性未定义,返回undefi。Ned;
给属性赋值:找到对象中的属性,如果存在就给它赋值,如果不存在就在对象中创建属性并给它赋值;
删除属性:如果属性存在于对象中,删除它,否则不做任何事情。
这种访问机制保证了对象属性可以覆盖(揭开)原型属性,但不会改变原型属性,这就是OOP的多态性。
构造函数在创建对象时需要使用prototype对象,通过prototype属性知道其对应类的prototype对象。此外,为了让实例对象知道谁创建了它,它的构造函数属性 "抓取 "构造函数。原型类对图像也被认为是由这个类的构造函数创建的。
接下来,让我们 让我们看看实现OOP的具体代码:
首先,不考虑继承关系,声明类的示例代码如下:
注意:应该避免直接使用特殊属性__proto__。正式的是调用方法,方法的参数是要创建的对象的原型对象。注意:按照OOP语言的传统,构造函数的名字就是类的名字。
当一个函数被调用时,如果这个上下文被绑定到一个普通的对象(而不是空的或者全局的对象窗口),这个函数被作为对象的方法调用。
当我们用一个新的表达式创建一个对象时,构造函数被new以方法的形式调用:
在上面的示例代码中,构造函数在开头和结尾所做的事情,新的表达式,为我们做了:
New会创建一个空白对象,使其原型链绑定构造函数的原型属性,使其构造函数属性绑定构造函数;然后调用构造函数,将此对象作为此的上下文,如果构造函数如果函数不返回值,则使用一个空白对象作为创建的对象。用代码写的是:
new调用的构造函数已经转化为构造函数,但为了保持其构造函数能力,一般实现如下:
接下来,考虑类的继承。
实例对象的初始化过程是:先被超类的构造函数初始化,再被子类的构造函数初始化,以满足子类覆盖超类的要求。基于此,示例代码如下:
写到这里,我们发现是一堆标准代码不得不写。所以早期很多前端框架陆续提供了上述代码的封装方案,但是一直没有统一的解决方案,直到ES6直接提供了类语法,整个事情才告一段落:
注意:JavaScript中的属性分为存储属性和访问属性(分别对应传统OOP语言中的字段和属性)。只有原型中的方法和访问属性可以在类中声明,而存储是在原型中声明的。属性必须是老方法。
类表达只是语法层面的封装,最终还是基于原型和原型链。
虽然我们不。;现在不需要根据那套复杂的规范来声明类,理解原型和原型链,深入理解JavaScript的OOP机制仍然非常重要。
最后给出JavaScript内置对象之间的原型链图(粗箭头为__proto__属性,细箭头为原型属性,虚箭头为构造器属性):
(Value: number, string, Boolean; Symbol, container : array, set, map)
ES6和以前的javascript的区别?
ES6是js的新标准,ES6之前的标准本质上都是原型继承函数p(){ this . x 5 } functions(){ this . y 6。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。