问题描述
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
上进行了设置,则F
和fn
实例都会继承它:
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
)