我正在尝试理解Javascript中的原型继承,但未能适用于以下情况。任何帮助将不胜感激。
我正在定义一个构造函数,如下所示:
var base = function() {
var priv = "private"; // Private
var publ = "public"; // Public through a getter/setter (below)
// The object to return
var f = {};
f.publ = function (new_val) {
if (!arguments.length) {
return publ;
}
publ = new_val;
return f;
};
return f;
};
使用此构造函数,我可以通过调用base();
来创建对象。这些对象有一个公共方法(publ)。
现在,遵循相同的结构,我想有一个新的构造函数,它创建的对象继承自上面定义的“基础构造函数”创建的对象:
var myclass = function () {
// Other parameters defined here
var f = function () {
// publ is inherited
console.log(f.publ());
};
// Trying to set the prototype of f to the object created by "base()"
f.prototype = base();
// Other methods defined here
return f;
};
使用f.prototype = base();
我想让f继承base()
返回的对象中定义的所有方法,但是尝试调用f.publ抱怨因为 f没有方法公布的
欢迎任何帮助理解正在发生的事情
米;
答案 0 :(得分:2)
进行原型继承的最常用方法如下:
function Base() {
var priv = "private";
this.publ = "public";
}
您现在可以使用Base
创建new Base
的实例。接下来我们创建MyClass
:
MyClass.prototype = new Base;
function MyClass() {
alert(this.publ);
}
最后,您可以使用MyClass
创建new MyClass
的实例,如下所示:
var a = new MyClass; // alerts "public"
自己查看演示:http://jsfiddle.net/b3QyE/
JavaScript中的原型继承可能会有点混乱,因为它是constructor-centric instead of prototype-centric这就是为什么我更喜欢使用以下实用程序函数来创建“类”:
function defclass(base, body) {
var uber = base.prototype;
var prototype = Object.create(uber);
var constructor = (body.call(prototype, uber), prototype.constructor);
constructor.prototype = prototype;
return constructor;
}
使用defclass
,您现在可以按如下方式重新构建代码:
var Base = defclass(Object, function () {
this.constructor = function () {
var priv = "private";
this.publ = "public";
};
});
var MyClass = defclass(Base, function (uber) {
this.constructor = function () {
uber.constructor.call(this);
alert(this.publ);
};
});
它更具可读性和可理解性。一切都封装在一个功能范围内,没有任何东西悬而未决。此外,您无需了解原型继承即可使用它。请参阅更新的演示:http://jsfiddle.net/b3QyE/2/
如果您注意到我们正在从Base
构造函数调用MyClass
类构造函数。这允许您使用Base
类构造函数初始化实例。您可以通过Base
调用uber
课程的任何方法。
要了解有关原型继承的更多信息,请查看以下答案: