首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sub.prototype = new () vs Sub.prototype = Base.prototype

Sub.prototype = new () vs Sub.prototype = Base.prototype
EN

Stack Overflow用户
提问于 2014-10-25 18:55:39
回答 5查看 127关注 0票数 4

有许多关于JavaScript原型和继承的在线资源。其中大多数使用类似于以下代码的代码:

代码语言:javascript
复制
function Base() {}
function Sub() {}

通过这样的继承实现:

代码语言:javascript
复制
Sub.prototype = new Base();

但是,我想知道以这种方式实现继承有什么问题:

代码语言:javascript
复制
Sub.prototype = Base.prototype;

第二种方法似乎也同样有效。我发现的唯一两个不同之处(海事组织是第二种方法的优点)是:

  • Base的虚拟实例化少了一个,这显然更好,因为无论如何都不使用实例。
  • 检查实例表明,第一种方法生成两个嵌套的__proto__属性,而第二种方法只生成单个属性,这使得实例更加简洁。

后者如下面的代码片段所示:

代码语言:javascript
复制
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);

给予:

但我的印象是我错过了一些非常重要的观点。我的问题是:反对第二种做法的理由是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-10-25 19:07:09

当您使用相同的原型时,您没有继承任何东西,您只是在创建另一个类型,即第一个原型的副本。

如果您在基类型对象中放置了任何内容,那么只要得到原型,它就不会被继承:

代码语言:javascript
复制
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);

票数 2
EN

Stack Overflow用户

发布于 2014-10-25 19:00:24

当您向Sub.prototype添加一个新属性时,您不希望它影响Base.prototype,对吗?那会很糟糕的。:-)

使用new Base()方法意味着您对Sub.prototype所做的任何更改都不会“泄漏”到Base.prototype

票数 4
EN

Stack Overflow用户

发布于 2014-10-25 19:05:38

我会这样安排的

代码语言:javascript
复制
function Base() {}

function Sub() {
  // call parent constructor; optional
  Base.call(this);
}

Sub.prototype = Object.create(Base.prototype, {constructor: {value: Sub}});

这非常类似于util.inherits在node.js中的工作方式。

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

https://stackoverflow.com/questions/26566042

复制
相关文章

相似问题

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