为什么在构造函数的prototype中添加的属性不能被构造函数使用?

daniel_mj
  • 10

代码如下:

javascriptfunction Foo() {};
Foo.prototype.talk = function () {
    alert('hello~\n');
};

var a = new Foo;
a.talk(); // 输出'hello~\n'

但是如果这样:

javascriptFoo.talk() // 报错:Object doesn't support property or method 'talk'
Foo.prototype.talk() // 没有问题

而且当我使用

javascript"talk" in FOO  //返回false

但是如果查看

javascriptFoo.prototype

会发现talk属性的确已经被添加上去了。

非常不理解这种行为。

回复
阅读 3.2k
2 个回答
✓ 已被采纳

因为这里a是构造出来的对象,其[[proto]]属性指向Foo.prototype。但Foo不是,Foo是一个函数对象,它的[[proto]]指向的是Function.prototype,因此有的是Foo.call Foo.apply这些函数对象上的方法(来自Function.prototypr)而不会有你定义的那个talk

粗(错)暴(误)地说,一个是对象,另一个是类,类上的动态方法只能用对象才能调到,直接对着类调到的只能是静态方法

i7tomato
  • 3
新手上路,请多包涵

protorype 是 构造函数的一个属性,我们可以这样理解。
假设定义一个对象. var obj = {name:"Andy", alias:{nickname: "Tiger"}};
我们要访问nickname这个obj的属性上的属性,需要这样访问: obj.alias.nickname;
但是如果我们直接防范obj.nickname 就会返回undefined//如果是一个方法,调用nickname就会报错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏