JS的魔法三角:constructor、prototype与__proto__
创作时间:
作者:
@小白创作中心
JS的魔法三角:constructor、prototype与__proto__
引用
CSDN
1.
https://m.blog.csdn.net/Cwayhome/article/details/144165080
在JavaScript中,constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个核心概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个"魔法三角":
1. constructor
- 定义:
constructor是一个函数,它被用来初始化一个新创建的对象实例。当使用new关键字创建一个新的对象时,构造函数会被调用。 - 作用:主要负责为新创建的对象设置初始属性和方法。
示例:
function Person(name, age) {
this.name = name;
this.age = age;
}
const Kobe = new Person('Kobe', 24);
2. prototype
- 定义:每个函数都有一个
prototype属性,它是一个对象,用于存储可以被该函数的所有实例共享的方法和属性。 - 作用:通过
prototype属性,可以实现原型链继承,允许子类继承父类的属性和方法。
示例:
Person.prototype.greet = function() {
console.log(`my name is ${this.name}.`);
};
const Kobe = new Person('Kobe', 24);
Kobe.greet(); // "my name is kobe."
3. proto
- 定义:
__proto__是每个对象的一个内部属性(非标准属性),指向该对象的原型对象。在ES6中,推荐使用Object.getPrototypeOf()或Object.setPrototypeOf()来获取或设置原型。 - 作用:
__proto__是原型链的核心,当尝试访问一个对象的属性时,如果该对象本身没有这个属性,JavaScript引擎会沿着__proto__链向上查找,直到找到该属性或者到达原型链的末端(通常是null)。
示例:
const Kobe = new Person('Kobe', 24);
console.log(Kobe.__proto__ === Person.prototype); // true
4. 关系
构造函数与prototype:
每个构造函数都有一个
prototype属性,这是一个对象,包含所有实例共享的方法和属性。当使用
new关键字创建对象时,新对象的__proto__属性会被设置为构造函数的prototype对象。__proto__与原型链:
__proto__属性使得对象能够访问其构造函数prototype上的方法和属性。通过
__proto__,可以形成一个从子对象到父对象的链式结构,即原型链。constructor与prototype:
prototype对象上有一个默认的constructor属性,它指向构造函数本身。这个
constructor属性可以帮助我们识别一个对象是由哪个构造函数创建的。
5. 图解
6. 示例代码
function Person(name, age) {
this.name = name;
this.age = age;
}
// 在构造函数的原型上添加方法
Person.prototype.greet = function() {
console.log(`my name is ${this.name}.`);
};
const Kobe = new Person('Kobe', 24);
// 查看Kobe的原型
console.log(Kobe.__proto__ === Person.prototype); // true
// 查看Person.prototype的constructor属性
console.log(Person.prototype.constructor === Person); // true
// 使用Kobe调用greet方法
Kobe.greet(); // "my name is Kobe."
// 原型链
console.log(Object.getPrototypeOf(Kobe) === Person.prototype); // true
7. 总结
- constructor:构造函数,用于初始化新创建的对象实例。
- prototype:构造函数的原型对象,用于存储可以被所有实例共享的方法和属性。
- proto:对象的内部属性,指向该对象的原型对象,用于实现原型链继承。
这就是JS的"魔法三角"吗?看起来并不难吧?
热门推荐
偏头痛,有救吗?
死神经牙齿为何会产生疼痛
洪灝 | 2024年下半年展望:逆共识的思考
“城乡中国”考题新解
检查淋巴挂什么科室?
职场通勤穿搭全指南:舒适与时尚的完美平衡诀窍
雅思写作第一部分图表数据分析指南
常泰长江大桥:重塑区域交通格局,引领常泰经济新飞跃
东汉末年三国鼎立时期,曹操、刘备和孙权的名字背后暗藏有何玄机
關於古巴的 10 個有趣事實
用电安全|慎用7款大功率家电 5贴士选购拖板&万能插苏 附全球地区电压
私域直播电商与社区团购结合:提升消费者信任与购买意愿
计算机网络中的端口概念及其在通信中的重要作用
新房甲醛科学去除方法综述,助您保障家庭健康
如何选择适合的相机内存卡(内存卡类型和容量的选择指南)
2025年个人如何报考电工证(正确方法步骤)
中考化学必备:实验室制取氧气的正确方程式与操作指南
五台山史话:殊像寺的魅力
自媒体行业的法律与合规指引
《辛德勒的名单》:从贪财的商人到救人的圣人,辛德勒救了全世界
解析新中式:从起源到营销
湿纸巾与湿厕纸,有什么区别?
深圳建成“15分钟社康圈”:患者就医报销比例高
为什么游隼如此快速?探讨游隼飞行速度的奥秘
商业观察:中小银行密集下调存款利率下的机遇与挑战(附热点板块)
延边边境村:G331沿线的安心与惬意
司法鉴定中的双方当事人:权利、义务与程序保障
科幻小说书单:为孩子的想象力插上翅膀
温州北站即将完工,为温州市区带来便利与发展机遇
文明小课堂 | 学文明礼仪知识,做文明有礼人