JavaScript 的原型的理解

166 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

JavaScript 原型

JavaScript 和其他的面向对象编程语言不同, 它使用原型和其他对象功能。所谓的原型,是说 JavaScript 对象相互继承特性的一种机制。 它们共享根原型对象中定义的数据和方法。

简单来说,所有 JavaScript 对象都从原型对象继承属性和方法。

工作原理

个人认为,在 JavaScript 中任何事物都是一个对象。函数 Function 是对象,字符串、布尔值和数字都是对象,数组也是一个对象。只有 undefined 不是对象。

为了实现继承,所有的对象的最初、最根对象的一个对象是原型对象。就是将这个原型对象当作一个模版,然后从中继承方法和属性。比如说 String 的父对象是 String.prototype, 数组的父对象是 Array.prototype。

打开浏览器的控制台,然后输入 String.prototype ,就能看到 String.prototype 对象:

2022-10-26-23-36-41-image.png

var str = "hello world";
str = str.toUpperCase();
str = str.trim()

使用字符串时,我们可以使用一些方法,如toUpperCase、trim,主要原因是它存在于 String.prototype 上。这就是要说的原型链。一个对象的原型也可能有一个原型对象,它继承了它的方法和属性。 我们称之为原型链。所以字符串可以使用 String.prototype 的方法和属性。

_proto _ 和 prototype

_proto _ 是是每个对象都有的属性,一个静态属性,指向当前对象的原型对象。

prototype 是以当前函数作为构造函数创建出来的对象的原型对象。

更具体地说,属性和方法是在对象构造函数的原型属性上定义的,而不是对象实例本身。

function DataObj() {
    this.value = 0;
}
DataObj.prototype.increment = function(){
    this.value ++;
    console.log(this.value)
}
const instance = new DataObj();
DataPro.increment();

在 js 中所有的函数都能作为构造函数构造出一个对象。所以 function DataObj() {} 其实就创建出一个 DataObj 对象。所以它有 prototype 对象。在给 prototype 增加 increment 的方法。

使用 new DataObj 创建一个实例。该实例有属性_proto_ ,它指向当前对象的原型对象。所以下面的表达式是 True 的

instance._proto_ === DataObj.prototype // true

总结

所以我对原型理解,每个对象都是有原型对象的。每个对象之所有能使用各种方法,是因为其继承了其原型对象的方法和属性。所以想给一个对象增加属性或者方法,只需对其原型对象增加属性和方法。

function Person(name){
    this.name =name
}
Person.prototype.age =18;
Person.prototype.SayHi = function(){
    return this.name+"say: hi!"
}