首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript原型的微妙之处:为什么“新”很重要

Javascript原型的微妙之处:为什么“新”很重要
EN

Stack Overflow用户
提问于 2013-08-10 05:07:16
回答 3查看 156关注 0票数 1

在我了解Object.create()之前,当我比现在更不了解原型时,我编写了一些代码,如下所示:

代码语言:javascript
运行
复制
var Foo = function() {
    this.report('Foo');
};

Foo.report = function(i) {  // You read that right; it's not 'Foo.prototype.report'
    alert('report: ' + i);
};

var Bar = function() {
    this.report('Bar');
};

Bar.prototype = Foo;  // Right; it's not 'new Foo()'

var b = new Bar();
b.report('b');

奇怪的是,这实际上是有效的,或者至少它按照我预期的方式工作:它会提醒'Bar‘,然后'b’。但是,如果我试图直接使用Foo(),它就失败了:

代码语言:javascript
运行
复制
var f = new Foo();
f.report('f');

浏览器告诉我,对象没有report()方法。为什么它适用于“b”,而不适用于“f”?此外,如果我设置了Bar.prototype = new Foo() (而不将Foo.report设置为Foo.prototype.report),那么'b‘同样有效,但是浏览器说'f’没有report()方法。但是,如果我将report()添加到Foo.prototype中,而不是仅仅将它添加到Foo中,那么一切都会很完美。当然,如果我设置了Bar.prototype = Object.create(Foo.prototype),一切都会正常工作。但是,误用的部分工作和失败的方式使我完全困惑。有人能帮我弄清楚我做这些事情的时候到底发生了什么吗?具体而言,当:

  • 我向Foo添加一个函数,而不是将它添加到Foo.prototype中。
  • 我将Bar.prototype设置为Foo,而不是将其设置为new Foo()Object.create(...)

Resig在幻灯片76中很接近这一点,但他没有解释。我知道这不是使用原型的方式,但我感觉到,理解这种行为会对js原型产生一些启示。我以为我明白了!

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18158812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档