函数(function)
function foo() {} // 函数声明
var foo = function() {} // 函数表达式
函数对象(function object):代表函数的对象
var foo = new function() {}
function Foo() {}
var foo = new Foo();
本地对象(native object)
独立于宿主环境的ES实现提供的对象,是ES定义的类(引用类型),包括:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError.
内置对象(build-in object)
ES实现提供的独立于宿主环境的所有对象,在ES程序开始执行时出现,已经被实例化了。Global和Math(每个内置对象都是本地对象)
宿主对象(host object)
由ES实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象
prototype
是每个函数都具有的属性,但不是每一个对象都有的属性
function Foo(){}
var foo = new Foo();
以上,Foo中有prototype属性,而foo没有。但是foo中的隐含_proto_属性指向Foo.prototype
JS 中所有的数据类型都是对象,为了实现面向对象,利用“继承”将所有的对象连接起来,通过new的方式来实现实例
_proto_
_proto_属性是每一个对象以及函数都隐含的一个属性,都是指向到创建它的构造函数的prototype。原型链就是通过这个属性构建的。
function a() {}
function b() {}
var b1 = new b();
a.prototype = b1;
var a1 = new a();
a1._proto_ === b1; // true
a1._proto_._proto_ === b.prototype; //true
a1._proto_._proto_._proto_ === Object.prototype; //true
原型和原型链的关系
1、JS所有东西都是对象,函数是一种特殊的对象
2、JS中所有的东西都是有Object衍生出来的,即所有东西原型链的重点指向Object.prototype
3、JS对象都有一个隐藏的_proto_属性,他指向创建它的构造函数的原型,但,Object.prototype._proto_指向的是null
4、JS中构造函数和实例之间的关系:
// 构造函数通过定义prototype来约定其实例的规格,再通过new来构造实例,作用是产生对象
var foo = new Foo();
// 构造函数本身是方法的实例,所以可以查到他的_proto_(原型链)
function Foo(){} 等价于 var Foo = new Function();
typeof(Object); // function Object也是通过Function创建出来的。
// Object的_proto_指向的是Function.prototype
Function.prototype._proto_ === Object.prototype; // true (所有东西都是对象)