【发布时间】:2015-06-17 14:07:30
【问题描述】:
AFAIK,JS 通过将原型链分配给新创建的对象来提供继承。所以,下面的代码对我来说似乎是正确的方法:
function Animal(name){
this.name = name;
}
Animal.prototype.getName = function(){return this.name;};
function Cat(){
Animal.apply(this, arguments);
}
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;
Cat.prototype.sayHi = function(){return 'Hi, my name is '+this.name+', and I am a "'+this.constructor.name+'" instance';};
这真的正确吗?而且,我读过,变异对象的原型是一个缓慢的不鼓励操作,这会影响以后对它的所有调用。但是在这里我们只是改变了Animal.prototype 和Cat.prototype。那么,这很糟糕吗?如果是我们如何处理呢?或者我误解了关于原型变异警告的一些内容?如果是这样,它的实际含义是什么?
【问题讨论】:
-
前段时间问了一个关于JS继承的问题:stackoverflow.com/questions/11661078/…。这不是同一个问题,但您可能会在回复中找到有用的信息。
-
如果你最终改变了所有 Animal 试图将方法添加到 Cat 的原型中,那么改变原型将是一个问题。在这里你正确地使用了 Object.create() 所以你让所有的动物都一样。
-
请注意,函数对象的 name 属性是对 ES5 的扩展(参见 ECMAScript ed 6 draft),不应依赖它(尽管它似乎被大多数浏览器的最新版本)。
-
“我已经读过,改变对象的原型是一个缓慢的不鼓励操作,它会影响以后对它的所有调用。”那是在什么背景下的?是的,如果你改变原型,它会影响共享原型的所有其他对象,但如果你不知道为什么要这样做,并且不是出于特定(有益的)目的而这样做,那只会是一件坏事.
-
@JoshBeam 片段的上下文,被你引用:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
标签: javascript inheritance prototype