认识原型对象和原型链

在 javascript 中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象 Object函数对象 Function
一般而言,通过 new Function 参省的对象时函数对象,其他对象都是普通对象。
举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function f1(){
//todo
};

var f2=function(){
//todo
};

var f3=new Function('x','console.log(x)');
var o1={};
var o2=new Object();
var o3=new f1();
console.log(
typeof f1,//function
typeof f2,//function
typeof f3,//function
typeof o1,//object
typeof o2,//object
typeof o3 //object
);
>> function function function object object object

f1 属于函数的声明,最常见的函数定义,f2 实际上是匿名函数,属于函数表达式,f3 不常见,但也是一种函数对象。

Function 是 JS 的自带的对象,f1,f2 在创建的时候,JS 会自动通过 new Function()的方式来构建这些对象,因此这三个对象都是通过 new Function()创建的。

在 JavaScript 中创建对象的方式有两种:对象字面量和使用 new 表达式,o1 和 o2 的创建恰好对应了这两种方式,重点讲一下 03,如果用 java 和 c#的思路来理解的话,o3 是 f1 的实例对象,03 和 f1 是同类型,至少以前我是这么认为的,其实不然……

怎么理解呢?很简单,看 o3 是不是通过 new Fuction()产生的,显然不是,既然不是函数对象,那就是普通对象。

阅读更多

深入理解 JavaScript 系列—什么是作用域

几乎所有编程语言最基本的功能之一,简单的说,作用域控制着变量与函数的可见性以及生命周期。那么问题来了:

  1. 变量存储在哪?
  2. 怎么找到变量?
    这些问题就需要一套良好的规则来存储和查找变量,而这种规则被称之为作用域。
    但是,究竟在哪里并且怎么设置这些作用域的规则呢?

我们学习作用域的方式就是将这个过程模拟成几个人物之间的对话。那么,由谁进行这场对话呢?

演员表

  • 引擎

从头到尾负责整个 Javascript 程序的编译及执行过程。

阅读更多