我对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方法中的一般方法和优点的缺点。
答案 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。