JS函数是什么;用于的原型属性

What does a JS function's prototype property used for?

本文关键字:原型 属性 用于 函数 是什么 JS      更新时间:2023-09-26

我通过__proto__属性了解javascript原型继承。但是,我注意到,当我这样做时,除了__proto__属性外,var f = function() {}f现在还将具有prototype属性。prototype似乎不参与属性链接。到底做了什么

它被指定为通过new关键字使用该函数创建的对象的原型。

例如:

function Foo() {
}
Foo.prototype.bar = 47;
var obj = new Foo();
alert(obj.bar); // alerts 47, via `obj`'s prototype

obj和分配给Foo.prototype的对象之间的引用是活动的,因此向Foo.prototype添加更多的内容将使它们显示在obj的原型上:

Foo.prototype.charlie = 62;
alert(obj.charlie); // alerts 62

当然,如果替换Foo.prototype(我不赞成),那么您将Foo.prototype指向另一个对象。obj仍将参考旧版本:

Foo.prototype = {delta: 77}; // Not recommended
alert(obj.delta); // alerts "undefined"

免费的实例

关于__proto____proto__是非标准的。在ECMAScript5(只有一年半的历史)之前,没有直接与对象原型交互的标准方法,只能在对象创建时分配,并且只能通过构造函数的prototype属性间接分配。__proto__是一些JavaScript引擎的专有扩展(最著名的是Mozilla的SpiderMonkey,Firefox中的引擎)。它没有出现在任何标准中,根据ECMAScript委员会的说法,它也不会出现。(相反,ECMAScript5提供了函数用于与对象原型交互。)__proto__现在被Mozilla弃用。

_proto_属性是对象的实例的属性(在本例中,对象是函数),它指的是实例的原型。您应该注意,此属性是非标准的且已折旧,请改用Object.getPrototypeOf(ref):https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto

相反,prototype是函数声明的一个属性(而不是实例),是函数所有实例的原型。查看文档:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/prototype

当您创建一个函数的新实例(使用new关键字)时,会创建一个由prototype定义的函数对象。在它被实例化(var myNewObject = new Foo())之后,对Object.getPrototypeOf(myNewObject)的调用将返回对实例所基于的原型的引用。

综上所述:__proto__是什么东西是什么,prototype是什么东西可以是(或可能已经是)。