当前位置: 首页 > 后端技术 > Node.js

从原型到原型链

时间:2023-04-03 12:24:22 Node.js

constructorfunctionAnimal(){}varcat=newAnimal();cat.name='Tom';console.log(cat.name)//Tomprototype每个函数都有一个原型prototype属性属性函数的of指向一个对象,该对象是调用构造函数创建的实例的原型,即本例中猫狗的原型。functionAnimal(){}//虽然注释里写了,但需要注意的是,prototype只是函数的一个属性Animal.prototype.name='Tom';varcat=newAnimal();vardog=newAnimal();console.log(cat.name)//Tomconsole.log(dog.name)//Tom原型的每个JavaScript对象(null除外)在创建时将与另一个对象相关联。这个对象就是我们所说的原型,每个对象都从原型“继承”属性。proto如何表示实例与实例原型之间的关系?这里我们需要提一下,proto的每个JavaScript对象(null除外)都有一个名为__proto__的属性。这个属性会指向对象的原型数组,regular、Math、Date、class数组等实例都是对象数据类型的值函数的原型。原型属性的值也是对象类型函数也是对象数据类型。每个对象数据类型的值都有自己的__proto__属性,用来指向它所属的类。原型函数Animal(){}varcat=newAnimal();console.log(cat.__proto__===Animal.prototype);//true实例对象和构造函数都可以指向原型构造函数每个原型都有一个constructor属性指向关联的构造函数Animal(){}console.log(Animal===Animal.prototype.constructor);//true可以获取functionAnimal(){}varcat=newAnimal();console.log(cat.__proto__==Animal.prototype)//trueconsole.log(Animal.prototype.constructor==Animal)//true//顺便学习一个ES5获取对象原型的方法console.log(Object.getPrototypeOf(cat)===Animal.prototype)//trueinstanceandprototype在读取实例的属性时,如果找不到,它会去prototype里面找这个对象关联的属性,如果找不到,就会去prototype的prototype中找,直到找到最顶层。functionAnimal(){}Animal.prototype.name='Tom';varcat=newAnimal();cat.name='Jerry';console.log(cat.name)//Jerrydeletecat.name;console.log(cat.name)//Tom,我们在实例中添加了name属性,当我们打印cat.name时,结果自然是Jerry。当我们删除cat的name属性时,当我们读取cat.name时,从对象中找不到name属性,我们会从cat的原型中查找,也就是cat.__proto__,也就是Animal.prototype,而结果是汤姆。反问:找不到怎么办?谁是原型的原型?prototype原型对象实际上是由Object构造函数生成的,实例的__proto__指向构造函数的prototype原型链。问题:Object.prototype的原型呢?是null,可以打印出来看看:console.log(Object.prototype.__proto__===null)//truenull表示“无对象”,即这里应该没有值。Object.prototype.__proto__的值为null和Object.prototype没有原型,其实意思是一样的。在搜索属性时,当找到Object.prototype时,搜索就会停止。图中黄线是由相互关联的原型组成的链式结构——原型链。由于函数也是对象,所以会在内存中单独开辟一块空间。因此,当实例对象较多时,内存空间会被很多重复的函数占用。例如:如果Person有100个实例对象,那么在内存空间中就会有100个eat方法占用空间,这些方法分别指向不同的实例对象。但是他们的执行结果是一样的。这样就造成了内存空间的浪费!为了解决这个问题,我们需要一个共享空间来存放一些公共的方法和属性,这就是原型。JavaScript原型是为了实现对象之间的连接而引入的属性,解决了构造函数无法共享数据的问题。原型链是实现对象之间关系即继承的主要方法。