我对 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());
以上两者有什么区别?
实际上我无法完全理解克罗克福德方法。任何人都可以帮助我找出通用方法的缺点和克罗克福德方法的优点。
Child.prototype = new Base ("childBase");
Kid.prototype = new Child ("K1", "K2");
通过这些行,您可以实例化两个对象,它们甚至有自己的名称。那有什么用呢?在更复杂的环境中,这甚至可能会破坏应用程序 - 当Base
构造函数使用私有变量和特权方法,它的所有子级将在同一个实例中共享相同的变量!
因此,一般不应该使用这种方式,而是使用 Crockfords 函数,旧版本的对象.create https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create。它将调用Base.prototype
,创建一个直接继承自该对象的新对象 - 它仅设置原型链,但不执行任何构造函数代码。了解 Crockford 的 Object.create shim https://stackoverflow.com/q/10141086/1048572将帮助您了解详细信息。创建的对象非常适合作为 Children 的原型对象。另请阅读这个答案 https://stackoverflow.com/a/1598077/1048572.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)