Js中的prototype、__proto__和constructor

本文深入探讨了JavaScript中prototype、__proto__和constructor的概念及其相互关系,解释了如何通过原型对象实现对象间的属性和方法共享,以及constructor属性在原型链中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Js中的prototype、__proto__和constructor

前言:阅读此文,请先阅读(Js面向对象的三大特点

  • 访问对象中不存在的属性,不会报错,而是返回undefined;
  • 强行给对象中不存在的属性或位置赋值也不会报错,而是自动在该位置添加新属性。

prototype

  • 当定义用于实例化对象的构造函数时,会附赠一个空的原型对象:构造函数 . prototype指向的就是原型对象
  • 原型对象中保存着所有子对象的共有属性和公共方法
  • 向原型对象中添加公共属性和方法
    i.找到当前构造函数的原型对象:构造函数 . prototype
    ii.向原型对象中添加公共属性和方法:强行赋值
    构造函数 . prototype . 方法名=function(){…}
  • 使用原型对象中的方法
    子对象 . 原型对象中的方法名

prototype vs __proto__

  • 为所有子对象保存共有方法的父对象,称为原型对象
  • 一个类型中,prototype和__proto___其实指向的是同一个原型对象
  • 区别:
    i. prototype属于构造函数对象,是站在和原型对象平级的位置,查找:构造函数 . prototype
    ii. __proto___属于每个子对象,是站在子级角度,称呼父对象
  • 所以:
    i. 想访问一个类型的原型对象都用:构造函数 . prototype
    ii.想访问某一个子对象的父对象都用:子对象 . __proto___

constructor

  • constructor是prototype上的一个保留属性,这个属性指向类的构造函数
尝试修改constructor:
function  Student(age){
  this.nowAge=age
}
Student.prototype.constructor=function(age){
  this.nowAge=age+1;
}
let  tom=new Student(2)
console.log(tom.nowAge); //输出2
所以,修改的只是prototype.constructor这个指针,真正的构造函数Student并不会被修改

prototype 和 __proto__和 constructor的关系

prototype 和 __proto__和 constructor的关系

JavaScript 中,每个对象都有一个 __proto__ 属性,指向其构造函数的原型对象。而每个函数都有一个 prototype 属性,指向该函数实例化出来的对象的原型对象。 __proto__ 属性是一个指针,指向该对象的构造函数的原型对象。通过 __proto__ 属性可以访问原型对象中的属性方法。这个属性在 ES6 中已经被标准化,可以用 Object.getPrototypeOf() 来获取对象的原型。 prototype 属性是函数的一个特殊属性,指向一个对象。当函数用作构造函数创建实例对象时,该对象的原型会指向构造函数的 prototype 属性指向的对象。也就是说,该对象可以访问构造函数原型对象中的属性方法。 举个例子: ``` function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log(`Hello, my name is ${this.name}`); } const p = new Person('Tom'); console.log(p.__proto__ === Person.prototype); // true console.log(Person.prototype.constructor === Person); // true console.log(p.constructor === Person); // true ``` 在这个例子中,我们定义了一个构造函数 `Person`,并给其原型对象添加了一个 `sayHello` 方法。我们通过 `new` 关键字实例化了一个 `Person` 对象 `p`。这个对象的 `__proto__` 属性指向了 `Person.prototype`,因此我们可以通过 `p.__proto__.sayHello()` 或者 `Person.prototype.sayHello.call(p)` 来调用 `sayHello` 方法。同时,我们也可以通过 `Person.prototype` 来访问 `Person` 构造函数原型对象中的属性方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值