javascript的原型链认知

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

一、提示:

我们将<script>元素放在 HTML 文件底部的原因是,浏览器按照代码在文件中的顺序解析 HTML。如果 JavaScript在最前面被加载,HTML还未加载,JavaScript将无法作用于HTML,所以JavaScript无效,如果 JavaScript 代码出现问题则 HTML 不会被加载。所以将 JavaScript 代码放在底部是最好的选择。

二、声明:

JavaScript有三种声明。

var

声明一个变量,可选择将其初始化为一个值。

let

声明一个块作用域的局部变量(block scope local variable),可选择将其初始化为一个值。

const

声明一个只读的常量。

常量不可以通过赋值改变其值,也不可以在脚本运行时重新声明。它必须被初始化为某个值。

常量的作用域规则与 let 块级作用域变量相同。若省略const关键字,则该标识符将被视为变量。

在同一作用域中,不能使用与变量名或函数名相同的名字来命名常量


在所有函数之外声明的变量,叫做全局变量,因为它可被当前文档中的任何其他代码所访问。在函数内部声明的变量,叫做局部变量,因为它只能在该函数内部访问。


三、变量声明提升(Variable hoisting)

JavaScript 变量的另一特别之处是,你可以引用稍后声明的变量而不会引发异常。这一概念称为变量声明提升(hoisting);JavaScript 变量感觉上是被“提升”或移到了所有函数和语句之前。然而提升后的变量将返回 undefined 值。所以在使用或引用某个变量之后进行声明和初始化操作,这个被提升的引用仍将得到 undefined 值。

四、集成与原型链

当谈到继承时,JavaScript 只有一种结构:对象。每个对象都有一个私有属性(称之为 [[Prototype]]),它持有一个连接到另一个称为其prototype 对象(原型对象)的链接。该 prototype 对象又具有一个自己的原型,层层向上直到一个对象的原型为 null。(译者注:Object.getPrototypeOf(Object.prototype) === null; // true)根据定义,null 没有原型,并作为这个原型链中的最后一个环节。

JavaScript 中几乎所有的对象都是位于原型链顶端的Object的实例。

JavaScript 对象是动态的属性“包”(指其自己的属性)。JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。

在 JavaScript 中,构造器其实就是一个普通的函数。当使用 new 操作符 来作用这个函数时,它就可以被称为构造方法(构造函数)。

ECMAScript 5 中引入了一个新方法:Object.create()。可以调用这个方法来创建一个新对象。新对象的原型就是调用 create 方法时传入的第一个参数:

在原型链上查找属性比较耗时,对性能有副作用,这在性能要求苛刻的情况下很重要。另外,试图访问不存在的属性时会遍历整个原型链。

遍历对象的属性时,原型链上的每个可枚举属性都会被枚举出来。要检查对象是否具有自己定义的属性,而不是其原型链上的某个属性,则必须使用所有对象从Object.prototype继承的hasOwnProperty方法。

推荐阅读更多精彩内容

  • JS中的函数 一、定义绝对值函数 第一种方式: 第二种方式: 函数相当于是匿名的,可以把结果赋值给abs,通过ab...
    雪国_3472阅读 49评论 0 1
  • 为什么使用 ES6 ? 每一次标准的诞生都意味着语言的完善,功能的加强。JavaScript语言本身也有一些令人不...
    肖青荣阅读 160评论 0 4
  • 1. 预解析的相关概念 JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaS...
    itlu阅读 88评论 0 3
  • 1.var 定义的是变量,没有块作用域的概念,可以跨块作用域访问,不能跨函数访问 块级作用域由 { } 包括,if...
    onresize阅读 983评论 0 2
  • TypeScript中接口的定义:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里...
    _hider阅读 81评论 0 3