为JS函数的原型设置一个属性

问题描述

我创建函数并在其原型中添加属性,如下所示:

let F = function(){}
 F.prototype.foo = 'abc'

我的问题是,为什么在使用F.foo时它将返回未定义? 但是使用完之后

let F = function() {}
F.prototype.foo = 'abc'
let fn = new F()
console.log(fn.foo) // return 'abc'

解决方法

foo prototype对象的属性,实例实例具有实例化时的内部原型。这与构造函数不同,后者完全不同。

调用构造函数时,您会得到一个实例作为返回,但是构造函数不是实例或实例的原型。

这是原型链在这里的工作方式:

Object.prototype -> Function.prototype -> F

Object.prototype -> F.prototype -> fn

F.prototype上进行设置时,它不在F的内部原型链上-仅在 instances 的原型链上。

如果您在Object.prototype上进行了设置,则Ffn实例都会继承它:

let F = function() {}
Object.prototype.foo = 'abc'
let fn = new F()
console.log(fn.foo) // return 'abc'
console.log(F.foo);

之所以可行,是因为Object.prototype处于两个原型链中。

(但这只是为了让您了解事物的工作方式-在实际代码中,您不应更改Object.prototype