我编写了这段代码来模拟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”函数。 我已经阅读了很多关于原型设计的文章,但没有解决调用基类函数的问题。
答案 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)
,您将获得似乎是"基础类"功能,但我不确定跨浏览器是如何的。