乐闻世界logo
搜索文章和话题

prototype 和proto区别

浏览14
8月9日 17:42

在JavaScript中,prototype属性和__proto__属性(通常读作"proto")是有关于对象原型链的概念,但它们在使用和目的上有所不同。

prototype属性

prototype是函数对象(Function objects)的一个属性。当你使用构造函数创建一个新对象时,这个新对象的内部[[Prototype]](也就是它的__proto__属性)会被赋值为构造函数的prototype属性。这意味着,使用同一个构造函数创建的所有对象都会共享同一个prototype对象。

举个例子,如果我们有一个构造函数:

javascript
function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log(`Hello, my name is ${this.name}`); };

当我们创建一个Person实例时:

javascript
var person1 = new Person("Alice");

person1对象的[[Prototype]](即__proto__)会指向Person.prototype,这使得person1能够访问到sayHello方法。

__proto__属性

__proto__是每个JavaScript对象都拥有的一个内部属性,它指向该对象的原型。这是一个从对象指向其构造函数的prototype属性的链接。根据ECMAScript标准,__proto__[[Prototype]]的实现,而[[Prototype]]是对象的内部属性。在现代JavaScript开发中,通常推荐使用Object.getPrototypeOf(obj)来获取对象的原型,而不是直接使用__proto__,因为__proto__并不是所有JavaScript环境中都得到支持。

再次拿刚才的例子,person1.__proto__会指向Person.prototype,因为person1是由Person构造函数创建的。

小结

  • prototype是函数特有的属性,用于当作构造函数时为实例对象指定原型。
  • __proto__是每个对象都有的属性,指向该对象的原型。

在实践中,prototype用来实现基于原型的继承和共享属性/方法,而__proto__提供了一种访问和操作对象原型链的方式。然而,直接操作__proto__被视为不太安全的做法,尤其是在现代JavaScript编程中,应该利用Object.getPrototypeOf()Object.setPrototypeOf()等方法来替代__proto__的直接使用。

标签:前端