前端面试常考问题之原型链

2023-02-23 0 910

序言

程序语言的五大优点

PCB承继

2.蓝本链的科学知识

蓝本链是程序语言的此基础,是十分关键的部份。有下列三种科学知识:

codelet有三种形式– 蓝本、缺省、示例、蓝本链 `instanceof`的基本原理new 操作符

## codelet有三种形式

### 形式一:字面上量

前端面试常考问题之原型链

上面的两种写法,效果是一样的。因为,第一种写法,`obj11`会指向`Object`。

– 第一种写法是:字面上量的形式。

– 第二种写法是:内置的缺省

### 形式二:通过缺省

前端面试常考问题之原型链

### 形式三:Object.create

前端面试常考问题之原型链

第三种形式,很少有人能说出来。这种形式里,obj3是示例,p是obj3的蓝本(name是p蓝本里的属性),缺省是`Objecet` 。

## 蓝本、缺省、示例,以及蓝本链

前端面试常考问题之原型链

PS:任何一个函数,如果在前面加了new,那就是缺省。

### 蓝本、缺省、示例三者之间的关系

前端面试常考问题之原型链

– 1、缺省通过 new 生成示例– 2、缺省也是函数,缺省的`prototype`指向蓝本。(所有的函数有`prototype`属性,但示例没有 `prototype`属性)– 3、蓝本对象中有 constructor,指向该蓝本的缺省。

上面的三行,代码演示:

前端面试常考问题之原型链

上面的代码中,`Foo.prototype.constructor === Foo`的结果是`true`:

前端面试常考问题之原型链

– 4、示例的`__proto__`指向蓝本。也就是说,`Foo.__proto__ === M.prototype`。

声明:所有的**引用类型**(数组、对象、函数)都有`__proto__`这个属性。

`Foo.__proto__ === Function.prototype`的结果为true,说明Foo这个普通的函数,是Function缺省的一个示例。

### 蓝本链

**蓝本链的基本基本原理**:任何一个**示例**,通过蓝本链,找到它上面的**蓝本**,该蓝本对象中的形式和属性,可以被所有的蓝本示例共享。

Object是蓝本链的顶端。

蓝本可以起到承继的作用。蓝本里的形式都可以被不同的示例共享:

**蓝本链的关键**:在访问一个示例的时候,如果示例本身没找到此形式或属性,就往蓝本上找。如果还是找不到,继续往上一级的蓝本上找。

### `instanceof`的基本原理

前端面试常考问题之原型链

`instanceof`的**作用**:用于判断**示例**属于哪个**缺省**。

`instanceof`的**基本原理**:判断示例对象的`__proto__`属性,和缺省的`prototype`属性,是否为同一个引用(是否指向同一个地址)。

**注意1**:虽然说,示例是由缺省 new 出来的,但是示例的`__proto__`属性引用的是缺省的`prototype`。也就是说,示例的`__proto__`属性与缺省本身无关。

**注意2**:在蓝本链上,蓝本的上面可能还会有蓝本,以此类推往上走,继续找`__proto__`属性。这条链上如果能找到, instanceof 的返回结果也是 true。

比如说:

– `foo instance of Foo`的结果为true,因为`foo.__proto__ === M.prototype`为true。– **`foo instance of Objecet`的结果也为true**,因为`Foo.prototype.__proto__ === Object.prototype`为true。

但我们不能轻易的说:`foo 一定是 由Object创建的示例`。这句话是错误的。我们来看下一个难题就明白了。

### 分析一个难题

**难题:**已知A承继了B,B承继了C。怎么判断 a 是由A**直接生成**的示例,还是B直接生成的示例呢?还是C直接生成的示例呢?

分析:这就要用到蓝本的`constructor`属性了。

– `foo.__proto__.constructor === M`的结果为true,但是 `foo.__proto__.constructor === Object`的结果为false。

所以,用 consturctor判断就比用 instanceof判断,更为严谨。

## new 操作符

当new Foo()时发生了什么:

(1)创建一个**新的空对象示例**。

(2)将此空对象的隐式蓝本指向其缺省的显示蓝本。

(3)执行缺省(传入相应的参数,如果没有参数就不用传),同时 this 指向这个新示例。

(4)如果返回值是一个新对象,那么直接返回该对象;如果无返回值或者返回一个非对象值,那么就将步骤(1)创建的对象返回。

举报/反馈

相关文章

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

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