对原型、原型链的理解

80 阅读3分钟

原型

  • 在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个prototype属性,其属性值是一个对象,该对象包含了可以由该构造函数的所有实例共享的属性和方法,当使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个指针指向构造函数的prototype属性对应的值,在ES5中这个指针被称为对象的原型,可以用__proto__属性来访问这个属性,但是最好不要使用这个属性,因为不是规范中规定的,ES5中新增了一个Object.getPrototypeOf()方法,可以通过这个方法来获取对象的原型
  • 是对象就会有__proto__这个属性(强调是对象);函数也是对象,那么函数也有这个属性,它指向构造函数的原型对象
  • 原型对象:原型对象(prototype)被定义为给其他对象提供共享属性的对象
  • 函数(function):函数是一种特殊的对象,函数的原型存放在prototype属性上
  • 对象(Object): 普通对象的原型是存放到内置属性[[Prototype]]上,可以通过对象的__proto__来访问对象的原型
  • 数组(Array): 数组也是一种特殊的对象,但与函数不同的是它的原型和普通对象一样,也是存放到内置属性[[Prototype]]上,可以通过数组的__proto__来访问数组的原型
function Person(name, age, job){    
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        console.log(this.name);
    }; // 与声明函数在逻辑上是等价的
}
let person1 = new Person("Nicholas", 29, "Software Engineer");
console.log(person1);
console.log(Person);
console.log(person1.prototype);//undefined
console.log(person1.__proto__);
console.log(Person.prototype);
console.log(person1.__proto__ === Person.prototype);//true

原型链

  • 当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是Object.prototype 所以这就是新建的对象为什么能够使用 toString() 等方法
  • 寻找原型链时,如果一直到原型链的末端还没有找到,则返回undefined
  • JavaScript 对象是通过引用来传递的,创建的每个新对象实体中并没有一份属于自己的原型副本。当修改原型时,与之相关的对象也会继承这一改变

1715328838980.jpg

__proto__prototypeconstructor

  • __proto__: 是对象就会有这个属性(强调是对象);函数也是对象,那么函数也有这个属性咯,它指向构造函数的原型对象
  • prototype :是函数都会有这个属性(强调是函数),普通对象是没有这个属性的(JS 里面,一切皆为对象,所以这里的普通对象不包括函数对象).它是构造函数的原型对象
  • constructor :这是原型对象上的一个指向构造函数的属性
  • Function.prototype.__proto__=== Object.prototype
  • 每一个对象都有__proto__属性,__proto__==>Object.prototype(Object 构造函数的原型对象)
  • 每个函数都__proto__prototype属性
  • 每个原型对象都有constructor__proto__属性,其中constructor指回'构造函数', 而__proto__指向Object.prototype
  • object是有对象的祖先,所有对象都可以通过__proto__属性找到它
  • Function是所有函数的祖先,所有函数都可以通过__proto__属性找到它
  • 每个函数都有一个prototype,由于prototype是一个对象,指向了构造函数的原型对象
  • 对象的__proto__属性指向原型,__proto__将对象和原型链接起来组成了原型链

原型链的终点

  • Object:Object.prototype.__proto__(Object是构造函数)
  • Object.prototype.__proto__=== null // true 原型链的终点是null
  • 原型链上的所有原型都是对象,所有的对象最终都是由 Object 构造的,而 Object.prototype 的下一级是 Object.prototype.__proto__

-------------------------------------------------------------------------------2024.5.11每日一题