0

我对 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 方法的优点。

4

1 回答 1

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

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

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

于 2012-08-05T01:56:27.760 回答