在javascript中引用父原型有什么好处?

在javascript中引用父原型有什么好处?,javascript,inheritance,polyfills,Javascript,Inheritance,Polyfills,我们都熟悉以下在JavaScript中创建对象的polyfill: function inherit(C, P) { var F = function () {}; F.prototype = P.prototype; C.prototype = new F(); } 这样做的一个缺点是,您将无法访问家长自己的成员。子实例将只能访问原型链 因此,我认为最好的继承解决方案如下: var inherit = (function () { var F = function

我们都熟悉以下在JavaScript中创建对象的polyfill:

function inherit(C, P) {
    var F = function () {};
    F.prototype = P.prototype;
    C.prototype = new F();
}
这样做的一个缺点是,您将无法访问家长自己的成员。子实例将只能访问原型链

因此,我认为最好的继承解决方案如下:

var inherit = (function () {
  var F = function () {};
  return function (C, P) {
    F.prototype = P.prototype;
    C.prototype = new F();
    C.prototype.constructor = C;
  }
}());

function Parent(a){
    this.a = a;
}

Parent.prototype.a_proto = function(){return "a_proto";}

function Child(a,b){
    Parent.apply(this,[a]);
    this.b = b;
}

inherit(Child, Parent);

var c = new Child("a","b");
console.log(c.a); // a
console.log(c.b); // b
console.log(c.a_proto()); // a_proto
delete c.a;
console.log(c.a); // undefined
我之所以喜欢上面的解决方案,是因为首先使用apply函数将父级自己的成员复制到子级自己的成员,从而允许真正继承父级自己的成员。其次,子对象还具有到原型链的链接,因此可以继承父对象的原型属性……而且由于我们使用代理,子对象无法修改父对象的原型

在《JavaScript模式》一书中,我还介绍了uber方法的概念。基本上,在uber方法中,作者说我们添加了对原始父对象的引用。这就像用其他语言访问超类一样,有时也很方便。以下是实现:

function inherit(C, P) {

  var F = function () {};

  F.prototype = P.prototype;

  C.prototype = new F();

  C.uber = P.prototype;

}

我不认为添加对原始父对象的引用有多好。现在孩子可以修改父母的原型,这是一件坏事。这个人在说什么,我们现在可以像其他语言一样访问超类了?我认为使用apply和原型链已经可以访问超类了。引用父对象的原型真的有什么好处吗?

假设您使用Child.prototype.xxx=..覆盖父对象的实例方法。。。。如果不直接引用Parent或Parent.prototype,您将如何调用super方法?我不确定您在这里引入了哪个新元素。如果是Parent.applythis,[a];,那么是的,你绝对应该这么做。这就像在Java或ES6中调用super一样。设置继承的典型方法是通过Object.createParent.prototype设置原型,并在子构造函数中调用父构造函数。看。@FelixKling我的问题是关于C.uber=P.prototype的;啊。。。我看不出这有什么特别的用途,因为Child引用了Parent。子项已能够修改Parent.prototype。并不是说这是一件好事,但加入优步并不会让事情变得更好或更糟。@FelixKling你是对的,我确实提到了父母。但正如RobW在第一条评论中所说的,如果我使用Child.prototype.xxx覆盖父实例,我将不再具有对父实例的引用,不是吗?