gpt4 book ai didi

javascript - 对象.prototype 和函数.prototype

转载 作者:行者123 更新时间:2023-11-28 13:13:17 25 4
gpt4 key购买 nike

在 JS 中,函数被称为对象。现在,当针对对象测试函数时,它们的行为有所不同。

a = {};
console.log(a.prototype); //undefined

function myFunc() {};
console.log(myFunc.prototype); //Object
Object.getPrototypeOf(myFunc); //function(){}

更糟糕的是,this MDN article 中的一个例子似乎改变了函数原型(prototype)的构造函数。

secondConstructor.prototype.constructor = secondConstructor;

有人可以解释一下这种行为吗?

最佳答案

导致常见混淆的是,作为对象的函数具有 .__proto__ 属性,而作为函数则具有 .prototype 属性。它们有不同的含义。

大多数 JavaScript 对象都有一个原型(prototype)对象,可以使用 Object.getPrototypeOf() 方法或简单的 .__proto__ 属性来访问。这是用于重用代码的对象,当属性访问器无法在对象上找到请求的属性时,会查阅该对象,然后在其原型(prototype)上查找。这就是像 .apply 这样的常见方法在函数上可用的方式。这是在示例中访问此对象的方式:

Object.getPrototypeOf(myFunc); //function(){}

只有函数具有 .prototype 属性,当使用函数创建新对象时,new 运算符将使用该属性。当使用 new 运算符调用函数并创建新对象时,JS 会检查函数的 .prototype 属性。如果它指向一个对象,JS就会将该对象设置为新创建对象的原型(prototype)。这就是为什么示例中对象的 .prototypeundefined 的原因:

a = {};
console.log(a.prototype); // undefined

Can someone please explain this behaviour?

secondConstructor.prototype.constructor = secondConstructor;

对象的constructor属性通常指向用于创建该对象的函数。声明函数时,会在该函数的 .prototype 属性指向的对象上自动创建此属性。

function c() {}
c.prototype.constructor === c; // true
var o = new c();
o.constructor === c; // true

但是,可以轻松更改此属性:

c.prototype = {constructor: function notCAnymore() {}}
var o = new c();
o.constructor === c; // false

现在我们不再有对正确函数的引用。所以改变原型(prototype)后,我们可能需要恢复.constructor属性:

c.prototype = {constructor: function notCAnymore() {}}
c.prototype.constructor = c; // restoring the correct constructor
var o = new c();
o.constructor === c; // true

这正是示例中所做的。原型(prototype)改变:

secondConstructor.prototype = new firstConstructor;

如果现在创建对象,则指向正确构造函数的指针将丢失:

var o = new secondConstructor();
o.constructor === secondConstructor; // false

这就是他们使用此代码来恢复它的原因:

secondConstructor.prototype.constructor = secondConstructor;
var o = new secondConstructor();
o.constructor === secondConstructor; // true

关于javascript - 对象.prototype 和函数.prototype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40780108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com