在我了解Object.create()之前,当我比现在更不了解原型时,我编写了一些代码,如下所示:
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(),它就失败了:
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原型产生一些启示。我以为我明白了!
https://stackoverflow.com/questions/18158812
复制相似问题