function f() {
this.f1 = function () {
console.log('hello world');
}
}
var ff = new f
ff.f1()// 成功输出hello world
f.f1()//报错 f1 is not a function
为何直接调用不行而必须要实例化后才能去调用呢?
function f() {
this.f1 = function () {
console.log('hello world');
}
}
var ff = new f
ff.f1()// 成功输出hello world
f.f1()//报错 f1 is not a function
为何直接调用不行而必须要实例化后才能去调用呢?
8 回答5.8k 阅读✓ 已解决
9 回答9.2k 阅读
6 回答4.7k 阅读✓ 已解决
5 回答3.5k 阅读✓ 已解决
3 回答10.3k 阅读✓ 已解决
4 回答7.9k 阅读✓ 已解决
7 回答9.8k 阅读
Q1:为什么报错?
因为f和它的原型链上都没有f1这个函数,所以f.f1是undefined,f.f1()必须报错:
Uncaught TypeError: f.f1 is not a function
Q2:为什么要实例化才能调用?
因为你实例化一个对象后,相当于给这个对象添加了一个属性f1,对象访问自身属性肯定是没问题的(暂不考虑Symbol定义的对象属性)
从代码之外的角度来理解:
f是构造函数,类似于建筑蓝图,记载了某个建筑的详细信息,比如有几个门,窗户在哪里。
new f()调用构造函数创造实例,类似于根据建筑蓝图造了个建筑。
门,窗户都是实际建筑才有的属性,蓝图只是张纸不是个实际建筑你去访问他的门当然访问不到了
(引自:https://www.zhihu.com/question/51820518)
如果你要访问函数内部变量,可用闭包: