如何使用原型来避免在javascript中复制函数?

时间:2012-04-21 14:45:44

标签: javascript

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

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”函数。 我已经阅读了很多关于原型设计的文章,但没有解决调用基类函数的问题。

3 个答案:

答案 0 :(得分: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"; 
}

答案 1 :(得分:0)

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

  

Javascript没有任何类型的“超级”属性   指向其父类。相反,你使用a的call()方法   函数对象,允许您使用不同的函数运行函数   对象作为它的上下文。如果您需要将参数传递给此   功能,他们会追求'这个'。

在你的情况下,它的功能与“方法”相同,所以你可以这样做:

Animal.prototype.setName.call(this, name);

答案 2 :(得分:0)

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

如果您执行console.log(puss.__proto__.getName),您将获得似乎是"基础类"功能,但我不确定跨浏览器是如何的。