JS面试高频题 原型与原型链


当前第2页 返回上一页

既然现在我们知道了什么是 prototype(原型)以及它的特点,那么原型链又是什么呢?

原型链

JavaScript 中所有的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链

同样的,我们使用一张图来描述

3.png

  • 所有原型链的终点都是 Object 函数的 prototype 属性
  • Objec.prototype 指向的原型对象同样拥有原型,不过它的原型是 null ,而 null 则没有原型

清楚了原型链的概念,我们就能更清楚地知道属性的查找规则,比如前面的 p 实例属性.如果自身和原型链上都不存在这个属性,那么属性最终的值就是 undefined ,如果是方法就会抛出错误

class类

ES6 提供了 Class(类) 这个概念,作为对象的模板,通过 class 关键字,可以定义类

为什么会提到 class

ES6class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

class Point {

  constructor(x, y) {

    this.x = x;

    this.y = y;

  }

 

  toString() {

    return '(' + this.x + ', ' + this.y + ')';

  }

}

 

// 可以这么改写

function Point(x, y) {

  this.x = x;

  this.y = y;

}

 

Point.prototype.toString = function () {

  return '(' + this.x + ', ' + this.y + ')';

};

class 里面定义的方法,其实都是定义在构造函数的原型上面实现实例共享,属性定义在构造函数中,所以 ES6 中的类完全可以看作构造函数的另一种写法

除去 class 类中的一些行为可能与 ES5 存在一些不同,本质上都是通过原型、原型链去定义方法、实现共享。所以,还是文章开始那句话 JavaScript是基于原型的

更多 class 问题,参考这里

关系判断

instanceof

最常用的确定原型指向关系的关键字,检测的是原型,但是只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型

1

2

3

4

5

function Person(){}

var p = new Person();

 

p instanceof Person // true

p instanceof Object // true

hasOwnProperty

通过使用 hasOwnProperty 可以确定访问的属性是来自于实例还是原型对象

1

2

3

4

5

6

7

8

9

function Person() {}

Person.prototype = {

    name: 'tt'

}

var p = new Person();

p.age = 15;

 

p.hasOwnProperty('age') // true

p.hasOwnProperty('name') // false

原型链的问题

由于原型链的存在,我们可以让很多实例去共享原型上面的方法和属性,方便了我们的很多操作。但是原型链并非是十分完美的

1

2

3

4

5

6

7

8

function Person(){}

Person.prototype.arr = [1, 2, 3, 4];

 

var person1 = new Person();

var person2 = new Person();

 

person1.arr.push(5)

person2.arr // [1, 2, 3, 4, 5]

引用类型,变量保存的就是一个内存中的一个指针。所以,当原型上面的属性是一个引用类型的值时,我们通过其中某一个实例对原型属性的更改,结果会反映在所有实例上面,这也是原型 共享 属性造成的最大问题

另一个问题就是我们在创建子类型(比如上面的 p)时,没有办法向超类型( Person )的构造函数中传递参数

以上就是JS面试高频题 原型与原型链的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

javascript如何添加节点

javascript字符串截取方法有哪些?

javascript是哪家公司开发的

javascript如何转换大小写

html5之javascript多线程的详解

javascript函数式编程中纯函数的理解(代码)

react可以做什么?

js要怎么学

javascript print方法怎么用

javascript是js吗

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...