- JavaScript 不必理解就可使用,通常来讲很难真正理解语言本身。即使是经验丰富的 JavaScript 开发者,如果没有认真学习的话也无法真正理解它们。
作用域
- 存储变量和访问变量的能力,使程序具有了 状态
- 需要一套设计良好的规则来存储变量,这套规则被称为作用域。
JavaScript事实上是一门编译语言
与传统的编译语言不同,它不是提前编译的,大部分情况下编译发生在代码编译前的几微秒。在作用域背后,Js 引擎用尽了各种办法来保证性能最佳。
原型 prototype
所有 Js 对象都会有一个特殊的 prototype 内置属性,是对于其他对象的引用。
- 当你对对象进行属性查找时,如果在对象中没有找到需要的属性,就会继续访问对象的 prototype 链。
- 普通的原型链都会指向内置的 Object.prototype, 所以它包含 Js 中许多通用的功能,如: .toString(), .valueOf(), .constructor, .length, .prototype
属性屏蔽
myObject.foo = "a"'
- 如果myObject 对象中包含名为 foo 的普通数据访问属性,这条赋值语句就会覆盖已有的属性值;
- 如果myObject 中没有 foo,prototype 链就会被遍历;
- 如果 prototype 链上也找不到,foo 就会被直接添加到myObject 上;
- 如果 foo既出现在 myObject 中又出现在 Prototype 链中,那么 myObject 中的 foo 会屏蔽上层的 foo,底层总是会屏蔽上层。
Prototype 的含义
function Foo() {}
所有的函数都会拥有一个名为 prototype 的公有属性,它指向一个Object对象。这个对象是在调用 new Foo()的时候创建的,然后让 Foo.prototype 指向它。
- 在面向类的语言中,类可以被实例化(复制)多次
- 在 Js 中并没有类似的复制机制,你不可能创建一个类的多个实例,只能创建多个对象,它们 prototype 指向同一个对象。这个机制被称为原型继承。Js 类的实现是基于原型继承机制的。
- Foo.prototype 有一个公有的属性 .constructor
- 修改对象的 prototype 的2种方法:
Bar.prototype = Object.create(Foo.prototype);
Object.setPrototypeOf(Bar.prototype, Foo.prototype);