Javascript和原型链接(没有查看原型的方法和变量)

时间:2010-10-21 14:10:54

标签: javascript

我读完了“面向对象的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);

1 个答案:

答案 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);

您可以将此解决方案与当前实施中的类型检查代码结合使用,但我会说如果这是在您自己的代码中使用的便捷方法,则可能不需要进行错误检查。