我读完了“面向对象的Javascript”。我正在遵循这个代码来“继承”和另一个对象:
function deriveFrom(child,parent)
{
if (parent == this)
alert("You can't inherit from self class type")
else
{
var f = function () { }
f.prototype = parent.prototype;
child.prototype = f;
child.prototype._super = f.prototype;
child.constructor = child;
}
}
我遇到的问题是,当我想访问未在子类中定义的函数或var时,它是在父类中,并且示例:
认为ClassB构造创建了一个名为myVar的var。
deriveFrom(ClassA,ClassB);
var obj=new ClassA();
这会创建一个这样的原型链:
obj->原型(功能) - >原型(ClassB) - > myVar的。
如果我做了类似a.myVar的事情,我会得到一个未定义的。为什么?该书指出javascript将通过原型查找var,直到获得它为止。所以,首先它将在obj中搜索它,没有发现它将获得它的原型对象它是一个函数,它将找不到它,然后它将继续进入函数原型,并在那里找到myVar。这不是这个过程吗?
如果我做了obj.prototype.myVar,它会找到它:S。
有人可以帮忙吗?
function ParentClass()
{
}
ParentClass.prototype.initWithAAndB=function(a, b)
{
this.a = a;
this.b = b;
}
function ChildClass()
{
}
//Inheritance
deriveFrom(ChildClass,ParentClass);
ChildClass.prototype.initWithAAndBAndC=function(a,b,c)
{
this._super.initWithAAndB(a, b);
this.c = c;
}
var a = new ChildClass();
a.initWithAAndBAndC(1, 2, 3);
//This works
a.prototype.initWithAAndB(7, 8);
//This does not work, but as the book I stated before explained the function should be found
a.initWithAAndB(7,8);
答案 0 :(得分:2)
每当你对这样的基本javascript设计模式有疑问时,首先要看的是伟大的Douglas Crockford。在他关于prototypal inheritance的文章中,他最终提出了以下解决方案:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
newObject = Object.create(oldObject);
您可以将此解决方案与当前实施中的类型检查代码结合使用,但我会说如果这是在您自己的代码中使用的便捷方法,则可能不需要进行错误检查。