1. 构造函数
// 构造函数 Person()
function Person(name, gender) {
this.name = name;
this.gender = gender;
}
var person = new Person("林俊杰", "男");
// 最后创建出来的对象实例 person
person
{
name: "林俊杰",
gender: "男"
}
普通函数 Person(),加上 new 关键字后,就构造了一个对象 person
- 构造函数的定义就是普通函数加上 new 关键字,并总会返回一个对象
2. 函数对象
JS 中的对象分为一般对象和函数对象。那什么是一般对象,什么又是函数对象呢?
JavaScript 的类型分为基本数据类型和引用数据类型,基本数据类型目前有 6 种(null, undefined, string, number, boolean, Symbol);其余的数据类型都统称为 object 数据类型,其中,包括 Array, Date, Function等,所以函数可以称为函数对象
3. 原型链
JavaScript 中的对象,有一个特殊的 [[prototype]] 属性, 其实就是对于其他对象的引用(委托)。当我们在获取一个对象的属性时,如果这个对象上没有这个属性,那么 JS 会沿着对象的 [[prototype]]链 一层一层地去找,最后如果没找到就返回 undefined
- 这条一层一层的查找属性的方式,就叫做原型链
4. 原型
所有对象都有 toString 和 valueOf 属性,那么我们是否有必要给每个对象一个 toString 和 valueOf 呢?可以但是没必要。因为JS每次声明一个对象都要写一次这些方法这样写的话会非常占用内存,所以JS 的做法是把所有的对象共用的属性全部放在heap堆内存的一个对象(共用属性组成的对象),然后让每一个对象的__proto__
存储这个「共用属性组成的对象」的地址。而这个共用属性,就是原型
-
原型的目的就是可以用来减少不必要的内存浪费
用一张图来解释对象使用函数来进行创建的方法 - 我们创建的对象的
__proto__
会用来指向原有的String对象,使得我们可以调用String对象的公有属性 -
__proto__
是某对象的共用属性的引用,是为了用户使用其共用属性中的方法而存在或使用的 - prototype 是浏览器写的,本身就存在,是某对象的共同属性的引用,为了不让对象的共用属性因没有被调用而被垃圾回收而存在
5. 烧脑等式
var n = new Number(1);
//var 对象 = new 函数;
//对象的__proto__最终指向某对象的共用属性,构造某对象的函数的prototype也指向某对象的共用属性
//__proto__ 是对象的属性,prototype是函数的属性
对象.__proto__ === 函数.prototype
//函数的prototype是对象,这个对象对应的就是最简单的函数Object
函数.prototype.__proto__ === Object.prototype
//由于函数本身即是函数(最优先被视为函数),也是对象,而函数的构造函数是Function
函数.__proto__ === Function.prototype
//Function即是对象,也是函数,但他优先是个函数
Function.__proto__ === Function.prototype
//Function.prototype也是对象,是普通的对象,所以其对应的函数是Object
Funciton.prototype.__proto__=== Object.prototype
- JS中万物皆可当作对象,所以Function既是函数也是对象
网友评论