JavaScript面试题总结系列(四)

4.JavaScript原型和原型链

4.1 概念介绍

  • 原型和原型对象
    原型也是对象,叫原型对象。所以,原型和原型对象是一回事,只不过有人说的简洁,有人说的是全称。
    ?
  • 原型链
    原型(原型对象)、构造函数和(对象)实例构成了原型链。原型链的核心就是依赖对象的__proto__指向,当检索依赖对象本身不存在的属性时,就会一层一层地向上去查找创建对象的构造函数,一直找到Object,就没有__proto__的指向了。
    ?
  • 构造函数
    首字母大写的函数。例如:
    ```javascript
    function Person() {

    }
    ```

  • 对象实例
    对象有两种:

    • 函数对象:通过 new Function(); 创建的对象;
    • 普通对象:除了函数对象之外的所有对象;

4.2 概念之间的关系

  • 每一个函数都有一个prototype属性;
  • 每一个JavaScript对象(null除外)都具有一个属性,叫做__proto__,这个属性指向该对象的原型(prototype);
  • 每一个原型都有一个 constructor 属性指向关联的构造函数,

    4.3 示例

  1. 使用构造函数创建对象
    ```javascript
    function Person() {

    }

    var person = new Person();
    person.name = "Kevin";

    console.log(person.name); // "Kevin"
    ``Person就是一个构造函数,我们使用new` 创建了一个实例对象 person。
    ?

  2. prototype
    每个函数都有一个prototype属性
    ?
    每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们说的原型,每一个对象都会从原型“继承”属性。
    ?
    ```javascript
    function Person() {

    }

    //注意:prototype是函数才会有的属性
    // 而__proto__是对象才会有的属性
    Person.prototype.name = "Kevin";
    var person1 = new Person();
    var person2 = new Person();

    console.log(person1.name); // "Kevin"
    console.log(person2.name); // "Kevin"
    ```

  3. proto
    ?
    ```javascript
    function Person() {

    }
    var person = new Person();
    console.log( person.__proto__ === Person.prototype ); // true
    ```

  4. constructor
    ?
    ```javascript
    function Person() {

    }
    console.log( Person === Person.prototype.constructor ); // true
    ```

    4.4 总结

    理解原型和原型链的前提是,弄清楚这里面一共有多少个概念,以及概念和概念之间的关系。

这里面涉及到的概念有:原型原型对象构造函数对象(实例)prototypeprotoconstructor

他们之间的关系是怎样的呢?

  • 首先,当我们创建一个大写字母开头的函数的时候,这个函数就是构造函数
  • 当我们new 一个这个构造函数的实例对象的时候,这个实例就是我们说的对象(实例),它具有 proto 属性;
  • 原型和原型对象是一回事,他们是基于构造函数new出来的对象,也就是函数对象而存在的,它具有prototype属性;
  • 原型和原型对象也有一个contructor属性(或者叫做指针),它指向关联的构造函数。
  • 每一个对象都有一个 proto 属性指向原型对象,这个原型对象还可以有它自己的原型,以此类推,形成了一个原型链。当查找特定属性的时候,先去这个对象里面查找,如果没有找到,那么就去它的原型对象里面找,如果还是没有,再去原型对象的原型对象里面去查找。这个操作被委托在整个原型链上,也就是我们所说的原型链了。

参考链接:
https://www.jianshu.com/p/be7c95714586
https://blog.csdn.net/xiaotao_css/article/details/72782416
https://blog.csdn.net/shuixiou1/article/details/81048816
https://www.cnblogs.com/zhengyeye/p/8986836.html
https://blog.csdn.net/m0_37585915/article/details/80843945
https://www.jianshu.com/p/08c07a953fa0
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
https://blog.csdn.net/lyt_angularjs/article/details/100729591
https://www.cnblogs.com/jianghao233/p/8983176.html
https://blog.csdn.net/m0_37585915/article/details/80843945
https://zhuanlan.zhihu.com/p/23090041?refer=study-fe
https://www.jianshu.com/p/dee9f8b14771
https://www.cnblogs.com/libin-1/p/5820550.html
https://blog.csdn.net/yucihent/article/details/79424506
https://zhuanlan.zhihu.com/p/22787302

原文地址:https://www.cnblogs.com/zxxsteven/p/11734689.html

时间: 2024-11-09 05:09:09

JavaScript面试题总结系列(四)的相关文章

JavaScript面试题总结系列(九)

9. JavaScript - ES6+介绍 一.var let const 区别: 使用 var 声明的变量,可以变量提升: 使用let. const声明的变量,没有变量提升: 二. 临时死区(Temporal Dead Zone) 与var不同,let和const声明的变量不会被提升到作用域顶部.因此,如果在声明之前访问这些变量,就会引发错误. 例如: if (condition) { console.log(typeof value); // 引用错误 let value = "blue&

JavaScript面试题总结系列(三)

3. JavaScript数组 3.1 数组常用方法 map: 遍历数组,返回回调函数返回值组成的新数组,不改变原数组 forEach:无法break,可以用try/catch中throw new Error来停止 filter:过滤 some:有一项返回true,则整体为true every:有一项返回false,则整体为false join:通过指定连接符生成字符串 push / pop:末尾推入和弹出,改变原数组, 返回推入/弹出项 unshift / shift:头部推入和弹出,改变原数

JavaScript面试题总结系列(五)

5.JavaScript继承 继承是什么 A对象通过继承B对象,就能直接拥有B对象的所有属性和方法. 方式一.原型链继承 核心:子类型的原型为父类型的一个实例对象 // 创建一个父类(注意其本质仍然是一个构造函数) function Parent() { this.name='kevin'; } // 创建父类上的一个共享方法 Parent.prototype.getName = function(){ console.log(this.name); } // 创建子类 function Chi

JavaScript面试题总结系列(六)

6.JavaScript作用域 作用域 概念 简单地说,作用域就是在上下文中,变量与函数的可访问范围.它可以分为块级作用域和函数作用域. 作用 作用域控制着变量与函数的可见性和生命周期. 作用域链 概念 作用域链可以理解为一组对象列表,包含父级和自身的变量对象,因此我们便能通过作用域链访问到父级里声明的变量或者函数. 作用 作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的 组成 由两部分组

JavaScript面试题总结系列(七)

7.JavaScript闭包 概念 闭包是函数,是能够读取其他函数内部变量的函数.例如:函数 A 返回了一个函数 B,并且函数 B 中使用了函数 A 的变量,函数 B 就被称为闭包. 特性 函数内部再嵌套函数 内部函数可以引用外层函数的参数和变量 内部函数的参数和变量不会被垃圾回收机制回收 作用 读取函数内部的变量 让这些变量始终保持在内存中,实现缓存 避免全局变量的污染 使用闭包主要是为了设计私有的方法和变量,即封装对象的私有属性和私有方法,实现封装 利用闭包可以突破作用链域 缺点 消耗内存.

Javascript面试题解析

Javascript的一些面试题让很多同学感到头疼,下面就根据兄弟连教育(www.lampbrother.net)毕业学员面试遇到的面试题,给大家做一个简单的分享,希望对初入职场的你们有一些帮助:Javascript面试题解析. 第一题 /* 解析: + 优先级大于 ? 此题等价于: 'Value is true' ? 'Something' : 'Nothing' 所以结果是:'Something' */ var val = 'smtg'; console.log('Value is ' +

sed修炼系列(四):sed中的疑难杂症

本文目录:1 sed中使用变量和变量替换的问题2 反向引用失效问题3 "-i"选项的文件保存问题4 贪婪匹配问题5 sed命令"a"和"N"的纠葛 1.sed中使用变量和变量替换的问题 在脚本中使用sed的时候,很可能需要在sed中引用shell变量,甚至想在sed命令行中使用变量替换.也许很多人都遇到过这个问题,但引号却死活调试不出正确的位置.其实这不是sed的问题,而是shell的特性.搞懂sed如何解决引号的问题,对理解shell引号问题有

理解javascript原型和作用域系列(1)——一切都是对象

“一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的函数——typeof().typeof应该算是咱们的老朋友,还有谁没用过它? typeof函数输出的一共有几种类型,在此列出: function show(x) { console.log(typeof(x)); // undefined console.log(typeof(10)); // number console.log(t

理解javascript原型和作用域系列(9)——简述【执行上下文】下

继续上一篇文章(http://www.cnblogs.com/wangfupeng1988/p/3986420.html)的内容. 上一篇我们讲到在全局环境下的代码段中,执行上下文环境中有如何数据: 变量.函数表达式——变量声明,默认赋值为undefined: this——赋值: 函数声明——赋值: 如果在函数中,除了以上数据之外,还会有其他数据.先看以下代码: 以上代码展示了在函数体的语句执行之前,arguments变量和函数的参数都已经被赋值.从这里可以看出,函数每被调用一次,都会产生一个新