2

我正在使用 JavaScript 中的类继承方法之一(在我正在修改的代码中使用),但不明白如何将子类中方法的附加功能附加到相应父类方法已经具有的功能; 换句话说,我想用一种方法覆盖子类中父类的方法,除了它自己的子类特定的东西之外,它的作用也与父类的方法相同。所以,我试图从孩子的方法中调用父母的方法,但它甚至可能吗?

代码在这里:http: //jsfiddle.net/7zMnW/。请打开开发控制台查看输出。

代码也在这里:

function MakeAsSubclass (parent, child)
{
    child.prototype = new parent;   // No constructor arguments possible at this point.
    child.prototype.baseClass = parent.prototype.constructor;
    child.prototype.constructor = child;

    child.prototype.parent = child.prototype; // For the 2nd way of calling MethodB.
}

function Parent (inVar)
{
    var parentVar = inVar;

    this.MethodA = function () {console.log("Parent's MethodA sees parent's local variable:", parentVar);};
    this.MethodB = function () {console.log("Parent's MethodB doesn't see parent's local variable:", parentVar);};
}

function Child (inVar)
{
    Child.prototype.baseClass.apply(this, arguments);

    this.MethodB = function ()
    {
        console.log("Child's method start");
        Child.prototype.MethodB.apply(this, arguments); // 1st way
        this.parent.MethodB.apply(this, arguments); // 2 2nd way
        console.log("Child's method end");
    };
}

MakeAsSubclass(Parent, Child);

var child = new Child(7);
child.MethodA();
child.MethodB();
4

3 回答 3

4

不,您看不到父母的局部变量。您继承父母原型链,而不是他们的本地状态。在您的情况下,您将父函数应用于不包含状态的子对象。

apply(this,...)

意味着您将函数绑定到 this 的当前值。当您从子对象调用方法 b 时,它会绑定到子对象,因此不在包含父值的闭包内操作。

于 2013-08-19T19:10:54.867 回答
2

我建议再次使用这样的私有实例值属性,因为它会弄乱原型。需要访问私有实例变量(每个实例都有自己的私有值)的函数不能放在原型上,所以你不能真正使用它。

这是您的代码的工作方式(但我自己不会这样做):

var Parent = function(){
  var private=22;
  this.showPrivate=function(){
    console.log(private);
  }
}
var Child=function(){Parent.call(this)};
// the following is only usefull if you have functions
// on the parent prototype that don't use privates
Child.prototype=Object.create(Parent.prototype);
// Child.prototype.constructor would now point to Parent
// it's not needed most of the time but you can fix that
Child.prototype.constructor=Child;

var c = new Child();
c.showPrivate();

以下是如何使用“私人”功能:

var Parent = function(name){
  //public instance variable
  this.name=name;
}
Parent.prototype=function(){
  // privates on the prototype (shared among instances)
  var privateFunction=function(me){
    console.log("private function called in:"+me.name);
    console.log("shared in "+me.name
      +" is now:"+shared+" setting it to 'changed'");
    shared="Changed";
  }
  // private shared value
  var shared="Parent"
  return{
    constructor:Parent,
    publicFn:function(){
     privateFunction(this); 
    }
  };
}();

var Child=function(name){Parent.call(this,name)};
Child.prototype=Object.create(Parent.prototype);
Child.prototype.constructor=Child;

var c = new Child("child1");
var c2 = new Child("child2");
c.publicFn();
c2.publicFn();//shared is already changed by 'child1'

有关构造函数的更多信息here

于 2013-08-20T00:14:17.373 回答
0

该变量var parentVar = inVar;是仅在函数中可用的局部和私有变量,并且仅对在同一范围 ( )Parent()中定义的函数可见。Parent()

我认为这里最好的方法是修改 Parent 类,使其parentVar不是私有的,而是公共的:

function Parent(inVar) {

    this.parentVar = inVar;

}
于 2013-08-19T19:31:22.983 回答