| 目录 |
|---|
| 引言 |
| 构造函数 |
| 函数对象 |
| 原型 |
| 原型链 |
| 整体总结一下 |
引言
- 首先所有存在的事物,都可称之为对象。
- 函数也是一样的道理,也可以看做是一个对象。
构造函数
简单来说,构造函数就是专门用来生成实例对象的函数,用来描述实例对象里面的属性。
// 基本的构造函数
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
}
//person1 是Person 的实例
var person1 = new Person("peng", 28, "前端");
注意:
- 1、构造函数名字的第一个字母通常大写。
- 2、函数体内部使用了this关键字,代表所要生成的对象实例。
- 3、生成对象的时候,必须使用new命令。
- 4、new命令就是执行构造函数,返回一个实例对象
函数对象
- JS所有对象分为函数对象和普通对象。
- 其中最直观的一种判断,凡是new Function()创建的,都可以称之为函数对象。
- 既然对象的存在,一定有对应的属性,函数对象一般有两个隐藏的属性
// prototype // 原型对象,(显式原型) // __proto__ // 隐藏式原型
原型
- 在js中我们使用构造函数新建一个对象的时候,每个构造函数的内部都有一个prototype属性值,这个属性值是一个对象,包含了可以有该构造函数的所有实例共享的属性和方法。
- 当我们使用构造函数创建一个对象后,这个对象的内部将包含一个指针,这个指针指向构造函数prototype属性对应的值,就叫做对象的原型
prototype
function PersonA() {}
console.log(typeof PersonA.prototype);
// object
console.log(typeof Object.prototype);
// object
-
从上面例子可以看出,prototype是一个普通对象,是函数对象的构造函数创建的一个实例。
-
相当于在PersonA创建的时候,自动创建了一个它的实例,并且把这个实例赋值给了prototype。
// 如果直接打印
console.log(PersonA.prototype);
//结果如下,实际上只有两个属性
//constructor
//__proto__
// 原型对象添加方法
function PersonA() {
}
PersonA.prototype.sayName=function () {
console.log(this.name)
}
constructor
- 构造器constructor就是用来构造函数对象的
- constructor 属性返回对创建此对象的函数对象的引用
proto
- 所有的对象obj(除了null、undefined以外)都有__proto__属性(隐式原型)
- proto 属性本质上是一个指针,指向函数对象的prototype属性
关系可以如下图所示
原型链
- 原型链是JS中实现继承的主要方法。
- 简单来说就是让一个引用类型继承另一个引用类型的属性和方法
整体总结一下
// 例子如下
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
}
var person1 = new Person("peng", 28, "前端");
//person1 是Person 的实例
// 1、Person是一个构造函数
// 2、person1是Person的一个实例
// 3、__proto__是原型,每个对象都存在原型
// 4、prototype是函数才有的属性
// 5、person1具备constructor属性,是因为他是Person的实例,是new出来的对象,person1 的 constructor
// person1.constructor==Person
// person1.__proto__==Person.prototype
// Person.prototype.constructor==Person