0

我编写了这段代码来模拟 OOP 继承并在 javascript 中调用基类,它可以工作:

function Animal(name,age)
  {
    this._name = name; 
    this.setName = function (name) { this._name = name }
    this.getName = function() { return this._name }
  }

  function Cat(name,age)
  {
    Animal.call(this,name,age); // call baseclass constructor
    this.getName = function() { return Cat.prototype.getName.call(this)+", a cat" }
  }
  Cat.prototype = new Animal(); // will create the baseclass structure

  /// *****  actual execution  *****
  var puss = new Cat("Puss",3);
  var cheshire = new Cat("Cheshire",10);
  // do some actions
  console.log ( puss.getName() );
  // change cat's name
  puss.setName("Puss in boots");
  alert ( "new name -->"+puss.getName() );

问题是,对于“new Cat()”的每个实例,“getName”和“setName”函数都会被复制。我已经阅读了很多关于原型设计的文章,但没有一篇涉及调用基类函数的问题。

4

3 回答 3

1

您应该将方法分配给函数的原型,例如,

function Animal(name, age) {
    this._name = name;
    this._age = age;
}
Animal.prototype.getName = function () { return this._name; }
Animal.prototype.setName = function (value) { this._name = value; }

function Cat(name, age) {
    Animal.call(this, name, age);
}
Cat.prototype = new Animal();
Cat.prototype.getName = function () { 
    return Animal.prototype.getName.call(this) + ", a cat"; 
}
于 2012-04-21T15:55:44.783 回答
0

您在寻找__proto__哪些存储原型数据? https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto

如果你这样做,console.log(puss.__proto__.getName)你会得到似乎是“基类”功能,但我不确定这是如何跨浏览器的。

于 2012-04-21T15:02:14.610 回答
0

来自http://phrogz.net/js/classes/OOPinJS2.html

Javascript 没有任何指向其父类的“超级”属性。相反,您使用 Function 对象的 call() 方法,它允许您使用不同的对象作为它的上下文来运行函数。如果您需要将参数传递给此函数,它们将在“this”之后。

在您的情况下,它与“方法”的功能相同,因此您可以执行以下操作:

Animal.prototype.setName.call(this, name);
于 2012-04-21T15:01:18.107 回答