有许多关于JavaScript原型和继承的在线资源。其中大多数使用类似于以下代码的代码:
function Base() {}
function Sub() {}通过这样的继承实现:
Sub.prototype = new Base();但是,我想知道以这种方式实现继承有什么问题:
Sub.prototype = Base.prototype;第二种方法似乎也同样有效。我发现的唯一两个不同之处(海事组织是第二种方法的优点)是:
Base的虚拟实例化少了一个,这显然更好,因为无论如何都不使用实例。__proto__属性,而第二种方法只生成单个属性,这使得实例更加简洁。后者如下面的代码片段所示:
function Base(){}
Base.prototype.bogus = function(){};
function SubNew(){}
function SubProto(){}
SubNew.prototype = new Base();
SubProto.prototype = Base.prototype;
var sn = new SubNew();
var sp = new SubProto();
console.log(sn);
console.log(sp);给予:

但我的印象是我错过了一些非常重要的观点。我的问题是:反对第二种做法的理由是什么?
发布于 2014-10-25 19:07:09
当您使用相同的原型时,您没有继承任何东西,您只是在创建另一个类型,即第一个原型的副本。
如果您在基类型对象中放置了任何内容,那么只要得到原型,它就不会被继承:
function Base(){
this.answer = 42;
}
function SubNew(){}
function SubProto(){}
SubNew.prototype = new Base();
SubProto.prototype = Base.prototype;
var sn = new SubNew();
var sp = new SubProto();
// show result in StackOverflow snippet
document.writeln(sn.answer);
document.writeln(sp.answer);
发布于 2014-10-25 19:00:24
当您向Sub.prototype添加一个新属性时,您不希望它影响Base.prototype,对吗?那会很糟糕的。:-)
使用new Base()方法意味着您对Sub.prototype所做的任何更改都不会“泄漏”到Base.prototype。
发布于 2014-10-25 19:05:38
我会这样安排的
function Base() {}
function Sub() {
// call parent constructor; optional
Base.call(this);
}
Sub.prototype = Object.create(Base.prototype, {constructor: {value: Sub}});这非常类似于util.inherits在node.js中的工作方式。
https://stackoverflow.com/questions/26566042
复制相似问题