1、数据类型、typeof运算符
JavaScript 语言的每一个值,都属于某一种数据类型。Javascript的数据类型共有7种(ES6新增一种Symbol类型)。 基本数据类型是不能再细分了,而复杂数据类型往往是多个基本数据类型的值组合而成
- 基本数据类型:Undefined、Null、Bollean、Number、String、Symbol(ES6新增)
- 复杂数据类型(引用类型):Object
typeof 操作符:typeof操作符可以检测给定变量的数据类型,返回下列某个字符串
- “undefined“--- 未定义
- “bollean” --- 布尔值
- “string” --- 字符串
- “number” --- 数值
- “object” --- 对象或null
- “function” --- 函数
2、对象和函数的关系
我们知道引用类型是一种数据结构,用于将数据和功能组织在一起。对象是某个特定引用类型的实例。新对象是使用new操作符后跟一个构造函数来创建的。可以这么说,对象都是通过函数创建的。
function Person(name){
this.name = name;
}
var p1 = new Person('a');
console.log(p1);
3、构造函数
构造函数本身就是一个函数,与普通函数没有任何区别,不过为了规范一般将其首字母大写。构造函数和普通函数的区别在于,使用new 生成实例的函数就是构造函数,直接调用的就是普通函数。
创建实例,使用new操作符,这种方式调用构造函数实际上会经历以下4个步骤:
- (1)创建一个新对象
- (2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
- (3)执行构造函数中的代码(喂这个新对象添加属性)
- (4)返回新对象
代码实现模拟new
function create(){
// 1、获得构造函数,同时删除 arguments 中第一个参数
Con = [].shift.call(arguments);
// 2、创建一个空的对象并链接到原型,obj 可以访问构造函数原型中的属性
var obj = Object.create(Con.prototype);
// 3、绑定 this 实现继承,obj 可以访问到构造函数中的属性
var ret = Con.apply(obj, arguments);
// 4、优先返回构造函数返回的对象
return ret instanceof Object ? ret : obj;
}
4、原型
我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向对象。 通过这个prototype属性可以让所有对象实例共享它所包含的属性和方法。 如:
function Person(){}
Person.prototype.name = 'mike';
Person.prototype.sayName = function(){
console.log(this.name);
};
var p1 = new Person();
var p2 = new Person();
这里由new创建的p1和p2实例就都拥有name属性和sayName方法
[[Prototype]] 和__proto__
该实例p1,p2将包含一个指针 [[Prototype]],指向构造函数的原型对象,在脚本中没有标准方式访问[[Prototype]],但是Firefox,Safari和Chrome在每个对象上都支持 __proto__

5、原型链
每个对象拥有一个原型对象,通过 __proto__ 指针指向上一个原型 ,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null。这种关系被称为原型链 (prototype chain),通过原型链一个对象会拥有定义在其他对象中的属性和方法。
function Parent(age) {
this.age = age;
}
var p = new Parent(50);
p; // Parent {age: 50}
p.__proto__ === Parent.prototype; // true
p.__proto__.__proto__ === Object.prototype; // true
p.__proto__.__proto__.__proto__ === null; // true
下图展示了原型链的运作机制
