「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
大家好我是刘十一,今天让我们一起来捋一捋函数、对象、原型、原型链的含义及它们之间的关系吧。
一、构造函数
所谓的构造函数其实就是一个普通的函数前面加了new运算符,其本质也是一个函数,所以构造函数都有函数的 prototype 属性。
构造函数上可以附带 实例成员 和 静态成员。
1、实例成员:
实例成员就是在构造函数内部,通过this添加的成员。实例成员只能通过实例化的对象来访问。
2、静态成员:
在构造函数本身上添加的成员,只能通过构造函数来访问。
例子
function Star(name,age) {
//实例成员
this.name = name;
this.age = age;
}
//静态成员
Star.sex = '女';
let stars = new Star('牛小六',18);
console.log(stars); // Star {name: "牛小六", age: 18}
console.log(stars.sex); // undefined 实例无法访问sex属性
console.log(Star.name); //Star 通过构造函数无法直接访问实例成员
console.log(Star.sex); //女 通过构造函数可直接访问静态成员
二、实例对象
实例就是通过构造函数创建出来的对象。
var A = function () {
this.name = '牛小六'
}
var obj = new A()
三、原型
在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性,它的属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。
当使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个指针指向构造函数的 prototype 属性对应的值,在 ES5 中这个指针 被称为 对象的原型。
1、原型是JavaScript继承的基础,JavaScript的继承就是基于原型的继承。
- 我们创建的每一个函数都有一个prototype属性,它指向一个对象,而这个对象可以包含 由特定类型创建的 所有实例 共享属性和方法。
- 那么 prototype 就是调用构造函数创建的对象实例的原型对象。
2、使用原型对象的好处
可以让 所有的对象实例 共享它所包含的 属性和方法。
四、原型链
prototype机制 就是存在于对象中的一个内部链接,它会引用其他对象。
如果在当前对象没有找到需要的属性或者方法引用,引擎就会沿着prototype关联的对象继续查找,以此类推。 这一系列对象的链接被称为原型链。
Object.prototype是原型链的最顶端,它的__proto__仍然存在,值为null 、
五、构造函数、实例、原型(对象)的关系
- 每个构造函数都有一个原型对象
- 针对每一个函数,都有prototype属性,该属性是一个对象。
- 每个原型对象都有一个指向构造函数的指针
- 针对每一个对象,都有一个__proto__指针,指向构造函数的原型对象。
- 每个实例都有一个指向原型对象的指针
proto 通常称为隐式原型,prototype 通常称为显式原型,可以说一个对象的隐式原型指向了该对象的构造函数的 显式原型。
在显式原型上定义的属性方法,通过隐式原型传递给了构造函数的实例。这样一来实例就能很容易的访问到构造函数原型上的方法和属性了。
![构造函数.jpg](p3-juejin.byteimg.com/tos-cn-i-k3…