Javascript中的原型链未更新

时间:2014-02-09 01:04:44

标签: javascript prototypal-inheritance

我正在尝试理解Javascript中的原型继承,但未能适用于以下情况。任何帮助将不胜感激。

我正在定义一个构造函数,如下所示:

var base = function() {
    var priv = "private"; // Private
    var publ = "public";  // Public through a getter/setter (below)

    // The object to return
    var f = {};

    f.publ = function (new_val) {
        if (!arguments.length) {
          return publ;
        }
        publ = new_val;
        return f;
    };

    return f;
};

使用此构造函数,我可以通过调用base();来创建对象。这些对象有一个公共方法(publ)。

现在,遵循相同的结构,我想有一个新的构造函数,它创建的对象继承自上面定义的“基础构造函数”创建的对象:

var myclass = function () {

  // Other parameters defined here

  var f = function () {
      // publ is inherited
      console.log(f.publ());
  };

  // Trying to set the prototype of f to the object created by "base()"
  f.prototype = base();

  // Other methods defined here

  return f;
};

使用f.prototype = base();我想让f继承base()返回的对象中定义的所有方法,但是尝试调用f.publ抱怨因为 f没有方法公布

欢迎任何帮助理解正在发生的事情

米;

1 个答案:

答案 0 :(得分:2)

进行原型继承的最常用方法如下:

function Base() {
    var priv = "private";
    this.publ = "public";
}

您现在可以使用Base创建new Base的实例。接下来我们创建MyClass

MyClass.prototype = new Base;

function MyClass() {
    alert(this.publ);
}

最后,您可以使用MyClass创建new MyClass的实例,如下所示:

var a = new MyClass; // alerts "public"

自己查看演示:http://jsfiddle.net/b3QyE/


JavaScript中的原型继承可能会有点混乱,因为它是constructor-centric instead of prototype-centric这就是为什么我更喜欢使用以下实用程序函数来创建“类”:

function defclass(base, body) {
    var uber = base.prototype;
    var prototype = Object.create(uber);
    var constructor = (body.call(prototype, uber), prototype.constructor);
    constructor.prototype = prototype;
    return constructor;
}

使用defclass,您现在可以按如下方式重新构建代码:

var Base = defclass(Object, function () {
    this.constructor = function () {
        var priv = "private";
        this.publ = "public";
    };
});

var MyClass = defclass(Base, function (uber) {
    this.constructor = function () {
        uber.constructor.call(this);
        alert(this.publ);
    };
});

它更具可读性和可理解性。一切都封装在一个功能范围内,没有任何东西悬而未决。此外,您无需了解原型继承即可使用它。请参阅更新的演示:http://jsfiddle.net/b3QyE/2/

如果您注意到我们正在从Base构造函数调用MyClass类构造函数。这允许您使用Base类构造函数初始化实例。您可以通过Base调用uber课程的任何方法。


要了解有关原型继承的更多信息,请查看以下答案:

  1. JavaScript inheritance and the constructor property
  2. How to achieve pseudo-classical inheritance right on the class declaration?
  3. Benefits of prototypal inheritance over classical?