javascript中prototype和__proto__的区别

在JavaScript中,prototype 和 proto 是两个与对象原型链相关的重要概念,但它们的作用和使用场景有所不同。

prototype
定义:prototype 是函数(Function)的一个属性。当你创建一个函数时,JavaScript引擎会自动为这个函数添加一个名为 prototype 的属性,它指向一个对象,这个对象就是该函数的原型对象。
用途:主要用来实现继承。当通过某个构造函数创建新对象时,这些新对象将共享该构造函数的 prototype 属性所指向的对象作为它们的原型。这意味着你可以在这个原型对象上添加方法或属性,所有从该构造函数实例化的对象都将能够访问到这些方法或属性。

示例:

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

const person1 = new Person('Alice');
person1.sayHello(); // 输出: Hello, my name is Alice

定义:proto 是每个JavaScript对象的一个非标准属性,它指向了该对象的原型对象。在ES6之后的标准中,推荐使用 Object.getPrototypeOf() 方法来获取一个对象的原型或者使用 Object.setPrototypeOf() 来设置一个对象的原型。
用途:用于手动查询或修改一个对象的原型。这在某些情况下非常有用,比如你想让一个对象直接继承另一个对象的方法和属性,而不必通过构造函数的方式。

示例:
const animal = {
eat: function() { console.log("I can eat"); }
};

const dog = {
bark: function() { console.log("Woof!"); }
};

// 设置dog的原型为animal
dog.proto = animal;

dog.eat(); // 输出: I can eat
dog.bark(); // 输出: Woof!

总结
prototype 是函数的属性,用来指定由该函数生成的所有实例共享的方法和属性。
proto 是对象的内部属性,指向该对象的原型,允许你读取或设置一个对象的原型。
值得注意的是,虽然 proto 在很多现代浏览器中得到了支持,但它并不是ECMAScript标准的一部分,因此更推荐的做法是使用 Object.getPrototypeOf 和 Object.setPrototypeOf 这样的标准API来进行原型操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容