至于你如何使用它们,没有区别。但是,从性能的角度来看,前一种方法会更可取。让我们稍微扩展一下您的示例:
var prototypePony1 = new Pony();
var prototypePony2 = new Pony();
var thisPony1 = new Pony2();
var thisPony2 = new Pony2();
prototypePony1.hasOwnProperty('bite'); //returns false
prototypePony2.hasOwnProperty('bite'); //returns false
thisPony1.hasOwnProperty('bite'); //returns true
thisPony2.hasOwnProperty('bite'); //returns true
Pony.prototype.bite = function() { alert('Nomnomnom!'); };
Pony2.prototype.bite = function() { alert('Nomnomnom!'); };
prototypePony1.bite(); //alerts 'Nomnomnom!'
prototypePony2.bite(); //alerts 'Nomnomnom!'
thisPony1.bite(); //alerts 'Chomp!', instance property is accessed first
delete thisPony2.bite;
thisPony2.hasOwnProperty('bite'); //returns false
thisPony2.bite(); //alerts 'Nomnomnom!'
在上面的示例中,thisPony1
两者thisPony2
都获得了自己的bite
函数副本,因为它是使用this
但是定义的,prototypePony1
并且都共享from的构造函数prototypePony2
的相同副本。
一旦我们在 Pony2 上定义了原型,实例属性仍然会首先在. 直到我们删除实例属性,我们才看到新定义的原型属性。
有关定义对象方法的更多详细信息,请查看此处。bite
Pony
bite
thisPony1
thisPony2