Javascript基本继承与Crockford原型继承

时间:2012-08-04 23:06:51

标签: javascript inheritance

我对Crockford推荐的继承感到困惑,Crockford方法与通用(默认)方式之间的主要区别是什么。

//Crockford method
      function object(o) {
            function F() {}
            F.prototype = o;
            return new F();
        }

以下是更通用的方式

function Base(name) {
    this.name = name;
}

Base.prototype.getName = function () {
    return 'Base :' + this.name;
}

function Child(name) {
    this.name = name;
}

Child.prototype.getName = function () {
    return 'Child :' + this.name;
}

function Kid(name) {
    this.name = name;
}

Kid.prototype.getName = function () {
    return 'Kid :' + this.name;
}

Child.prototype = new Base ("childBase");
Kid.prototype = new Child ("kidChild");

var base = new Base ("myBase");
var child = new Child("myChild");
var kid = new Kid("myKid");

console.log(base.getName());
console.log(child.getName());
console.log(kid.getName());

以上两者有什么区别?

实际上我无法完全理解Crockford方法。任何人都可以帮我弄清楚Crockford方法中的一般方法和优点的缺点。

1 个答案:

答案 0 :(得分:1)

Child.prototype = new Base ("childBase");
Kid.prototype = new Child ("K1", "K2");

使用这些行来实例化两个对象,这些对象甚至拥有自己的名称。这有什么用?在更复杂的环境中,这甚至可能会破坏应用程序 - 当Base构造函数使用私有变量和特权方法时,它的所有子节点将在同一个实例中共享相同的变量!

因此,人们通常不应该使用这种方式,而是Crockfords函数,Object.create的旧版本。它将使用Base.prototype调用,创建一个直接从该对象继承的新对象 - 它只设置原型链,但不执行任何构造函数代码。 Understanding Crockford's Object.create shim将帮助您了解详情。然后,创建的对象非常适合成为Children的原型对象。另请阅读this answer