JavaScript中一切皆对象。es6
除了undefined
以外全部的数据类型都是对象(引用类型)或者有其对应的包装类(原始类型)。函数
原始值(不可变)this
引用类型spa
//null也是对象 typeof null //"object"
null
除外。能够理解为全部对象都是由函数产生的,均可以使用new
关键字建立,函数也是一个对象,由Function
产生。prototype
var num = new Number(); //数字 var str = new String(); //字符串 var bool = new Boolean(); //布尔值 var obj = new Object(); //空对象
//定义一个函数 function sum(a, b){ return a + b; } //至关于下面的写法 var sum = new Function("a", "b", "return a + b");
//自定义构造函数 function Person(name, age){ this.name = name; this.age = age; } var person = new Person('wlicox', 18); //自定义对象
new
一个对象的时候JS作了哪些事情this
对象;this
对象中包括一个prototype
属性,指向该构造函数的原型;prototype
对象中包括一个construtor
属性,指向该构造函数自己;this
。用代码解释大概就是下面这样的:code
假设有一个自定义构造函数Person
对象
function Person(name, age){ this.name = name; this.age = age; }
当执行var person = new Person('wlicox', 18)
时blog
function Person(name, age){ //1.隐式的建立一个this对象 var this = { //2.有一个prototype属性 prototype: { construtor: Foo //3.指回Foo本身 } }; /*用户代码*/ this.name = name; this.age = age; return this; //4.隐式的返回this }
new
关键字调用,普通函数使用()
调用;new
建立的对象就一直是该返回值(返回原始类型的值不影响结果),普通函数有没有返回值均可以。function Person(name, age){ this.name = name; this.age = age; return {}; } var person = new Person('wilcox', 18) console.log(person) //{}
prototype
prototype
属性找到它的原型;construtor
Person === Person.prototype.constructor //true
__proto__
__proto__
属性找到其构造函数的原型;person.__proto__ === Person.prototype //true
prototype
、construtor
、__proto__
三者的关系__proto__
属性,由__proto__
属性串联起来的的对象的集合就是原型链外;Object
的原型是最顶端的原型,其中有一个toSting
方法,这也就是为何全部的数据类型都自带toString
方法。null
没有原型注意:由于对象都是由构造函数参数的因此Function
是一开始就存在的,再js代码执行的时候,Function
就被放入到内存中,Function
也是对象,但它没有构造函数,因此它的__proto__
指向它的本身的原型。