【问题标题】:Javascript inheritance without child.prototype = new parent();没有 child.prototype = new parent() 的 Javascript 继承;
【发布时间】:2012-01-05 08:53:12
【问题描述】:

我在玩 javascript 原型链继承时遇到了这种有趣的行为。

我有一个父类和一个子类

//class parent
function parent(param_1) {
    this.param_1 = param_1;

    this.getObjWithParam = function(val) {
        console.log(this);
        console.log("Constructor value in parent class " + this.param_1);
        console.log("tguha ----> parent,  val " + val);
    };
};

//class child
function child(param_1) {
    parent.call(this, [ param_1 ]);
};

var childObj = new child(100);
childObj.getObjWithParam(200);

我得到的输出为

**>child**
Constructor value in parent class 100
tguha ----> parent,  val 200

我没有在做 //child.prototype = new parent(); 并且仍然继承父类。

谁能帮我解释一下这个场景。

【问题讨论】:

    标签: javascript prototypal-inheritance


    【解决方案1】:

    这个代码中没有出现原型这个词。所以没有任何东西被继承。您创建一个新的child,然后在新的child 上显式运行parent 构造函数。然后parent 构造函数向新的child 添加一个方法。

    如果您将getObjWithParam 放在parent.prototype.getObjWithParam 上,那么您会发现它不会继续存在。

    【讨论】:

    • 我对同一行还有另一个困惑。这一次,我有 3 个级别的继承,而不是 parent.call(this, [ param_1 ]); 我有 this.constructor(param_1); 将调用传递给超类构造函数。几天前我在这里描述了这个问题。 stackoverflow.com/q/8701114/1099211 可能同样的逻辑也可以解释那里发生的现象。
    【解决方案2】:

    您在子构造函数中调用父构造函数。因为父构造函数设置了this.getObjWithParam = function[...],它也会为孩子设置它。请注意,这与原型无关。 通过调用parent.call(a, [...]),您可以调用父函数并将范围设置为a。这意味着对this 的任何修改也会对a 进行(因为它是同一个对象)。

    【讨论】:

      【解决方案3】:
      parent.call(this, [ param_1 ]) 
      

      将 Parent.param_1 和 Parent.getObjWithParam 分配给 childObj。这与继承无关。考虑这个公式:

      var foo = {};
      
      //class parent
      function parent(param_1) {
          this.param_1 = param_1;
      
          this.getObjWithParam = function(val) {
              console.log(this.param_1);
              console.log(val);
          };
      };
      
      //class child
      function child(param_1) {
          parent.call(foo, [ param_1 ]);
      };
      
      var childObj = new child( 'lets give foo a param_1');
      
      console.log( typeof childObj.getObjWithParam );
      // Undefined
      
      foo.getObjWithParam();
      // ["lets give foo a param_1"]
      

      在这里,您将 foo 作为范围传递给 .call(),因此属性被分配给 foo。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-20
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多