面试问题分享 – 5:解释一下 原型、构造函、实例、原型链 之间的关系

2023-05-28 0 339

codelet有这三类形式?

// 面向全国字面上量 var o1={name:01}; var o11=new Object({name:o11}); // 采用表明的缺省: var M=function(){this.name=02}; var o2=new M(); // 透过Object.create()建立 var P={name:o3}; var o3=Object.create(P)

嘿嘿 蓝本、内部结构函、示例、蓝本链 间的亲密关系?

面试问题分享 – 5:解释一下 原型、构造函、实例、原型链 之间的关系

1、此基础

缺省能透过new来聚合两个示例、缺省也是表达式;

表达式都有两个prototype特性,那个是蓝本第一类;

蓝本第一类能透过内部结构器constructor来对准它的缺省;

示例的__proto__特性,对准的是其缺省的蓝本第一类;

蓝本链

:从两个示例第一类,向上找内部结构那个示例相关联的第一类,相关联的第一类又向上找,找到创造它的两个示例第一类,

一直到Object.prototype截止。原型链是透过prototype和__proto__向上找的。缺省透过prototype建立了很多方法,

被其所有示例所公用,存放在蓝本第一类上;

例子:

var M=function(name){this.name=name};var o3=new M(o3);

当我们需要扩展示例的时候,我们能对缺省添加方法,但是这样会建立每两个示例都拷贝一份它自己的添加的方法,

占用内存,而且也没有必要,那个时候就能新添加的方法写进蓝本里面去,添加到蓝本链中去,

在示例的蓝本链中我们能在蓝本第一类上找到添加的方法; var M=function(name){this.name=name}; var o3=new M(o3); M.prototype.say=function(){ Console.log(say hi); }; var o5=new M(o5);

透过这种形式o3和o5都有say方法;蓝本链的优势是蓝本第一类的方法是被所有示例共有的;

当访问两个示例方法的时候,首先在示例本身找那个方法,如果没有找到就会到其构建表达式的蓝本第一类去找,如果还是没有找到,

那么它会继续透过蓝本链在蓝本第一类的更上一级查找,一直到object.prototype;

一定要记住只有表达式才有proptotype,第一类是没有的;

只有示例第一类又__proto__ , 因为表达式也是第一类,所以表达式也有__proto__ , 但是和示例第一类的__proto__是有区别的,表达式的__proto__是function那个第一类的内部结构示例;

2、instanceof 原理

示例第一类上面有两个__proto__ ,那个是引用的它缺省的蓝本第一类;

instanceof是用来判断示例是不是由某个缺省示例化出来的第一类,其原理是判断示例第一类是否对准缺省的蓝本;

只要是在蓝本链上的表达式,都会被instanceof看做是示例第一类的两个缺省,所以都会返回true;m1.__proto__===m1.prototype;返回true m1.prototype.__proto===Object.prototype;返回trueo3.__proto__.constructor===Object;//返回false 所以我们判断两个示例第一类的缺省,用constructor;

3、new 运算符

后面跟着的是两个缺省

两个新第一类被建立。它继承自 foo.prototype->

缺省foo会被执行,执行的时候,相应的传参会被传入,同时上下文(this)会被指定为那个新示例。 new foo等同于new foo(),只能在不传递任何参数的情况->

如果缺省返回了两个‘第一类’,那么那个第一类会取代整个new 出来的结果。如果缺省没有返回值, 那么new出来的结果为步骤1建立的第一类

4、Object.create()

建立的示例第一类是对准的对象蓝本,示例第一类本身是不具备codelet的特性和方法的,是透过蓝本链来链接的。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务