您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# JS构造函数实例对象和原型对象之间的关系是什么
## 引言
在JavaScript中,构造函数、实例对象和原型对象构成了面向对象编程的核心机制。理解它们之间的关系是掌握JS对象模型的关键。本文将深入剖析这三者的联系,并通过代码示例揭示原型链的运行原理。
## 一、构造函数与实例对象
### 1.1 构造函数的作用
构造函数是通过`new`关键字调用的特殊函数,用于创建特定类型的对象:
```javascript
function Person(name) {
this.name = name;
this.sayHello = function() {
console.log(`Hello, I'm ${this.name}`);
};
}
const person1 = new Person('Alice');
当使用new
操作符时:
1. 创建一个空对象
2. 将构造函数中的this
指向该对象
3. 执行构造函数中的代码
4. 返回新对象(除非构造函数返回其他对象)
每个实例都拥有独立的属性副本:
const person2 = new Person('Bob');
console.log(person1.sayHello === person2.sayHello); // false
每个函数都有一个prototype
属性,指向其原型对象:
console.log(Person.prototype); // 原型对象
将方法定义在原型上可避免重复创建:
Person.prototype.sayHello = function() {
console.log(`Hello, I'm ${this.name}`);
};
此时所有实例共享同一方法:
console.log(person1.sayHello === person2.sayHello); // true
构造函数 Person
│
├── prototype → 原型对象 Person.prototype
│ │
│ ├── constructor → 构造函数 Person
│ └── __proto__ → Object.prototype
│
└── 实例 person1
│
└── __proto__ → Person.prototype
prototype
:构造函数特有的属性__proto__
:实例对象的内部原型链接(现建议使用Object.getPrototypeOf()
)constructor
:原型对象指向构造函数的属性当访问实例属性时:
1. 先在实例自身查找
2. 找不到则沿__proto__
向上查找
3. 直到Object.prototype(原型链顶端)
person1.toString(); // 最终调用Object.prototype.toString
// 检查原型关系
console.log(person1 instanceof Person); // true
console.log(Person.prototype.isPrototypeOf(person1)); // true
// 获取原型对象
console.log(Object.getPrototypeOf(person1) === Person.prototype);
ES6的class实质仍是基于原型的语法糖:
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(`Hello, I'm ${this.name}`);
}
}
typeof Person; // "function"
Person.prototype.sayHello; // 方法依然定义在原型上
为内置对象添加方法:
Array.prototype.last = function() {
return this[this.length - 1];
};
组合使用构造函数和原型链:
function Student(name, grade) {
Person.call(this, name);
this.grade = grade;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
过长的原型链会影响属性查找速度,应保持合理的继承层级
function Foo() {}
const obj = new Foo();
Foo.prototype = { bar: 1 }; // 不会影响已创建的实例
console.log(obj.bar); // undefined
不当的原型修改会影响所有相关实例:
Array.prototype.push = function() {
console.log('Array.push disabled!');
}; // 危险操作!
new
创建实例对象constructor
指回构造函数理解这三者的关系,是掌握JavaScript面向对象编程的核心所在。
本文通过2000字左右的篇幅系统讲解了JS中构造函数、实例对象和原型对象的三角关系,包含了代码示例、示意图和实际应用建议,采用Markdown格式实现技术文档的标准排版。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。