我试图在Javascript中创建一个原型。我希望我的原型能够继承某些方法,而不需要将它们添加到每个方法中,而不是使用从零开始构建的普通原型。
因此,我在原型中添加了一个方法logDependencies(),以检查Car实例中是否存在Dependency实例,而不是这段代码:
function Dependency(data) {
this.data = data;
}
function Car(color) {
this.color = new Dependency(color);
this.logDependencies = function () {
for (var key in this)
if (this.hasOwnProperty(key))
if (this[key] instanceof Dependency)
console.log("Dependency: " + key);
};
}
var lamborghini = new Car("red");
lamborghini.logDependencies();相反,我希望让我的所有原型继承函数logDependencies(),而不需要手动添加它。
,我该怎么做?
更新:
对于那些对我的措辞感到困惑的人:
我正在尝试制作一个原型函数,它允许我创建继承某些属性和方法的原型,并将它们传递到继承链中。
道格拉斯·克罗克福德的一篇相关文章(强调我自己的):
我的旅程是迂回的,因为JavaScript本身对于它的原型性质是矛盾的。在原型系统中,对象继承对象。然而,JavaScript缺少一个执行该操作的操作符。相反,它有一个新的运算符,因此
new f()生成一个继承自f.prototype的新对象。 这种间接设置的目的是使这种语言在受过传统训练的程序员看来更加熟悉,但却没有做到这一点,正如我们从Java程序员对JavaScript的极低评价中所看到的那样。JavaScript的构造器模式对经典的人群没有吸引力。它也掩盖了JavaScript真正的原型特性。因此,很少有程序员知道如何有效地使用这种语言。 幸运的是,很容易创建一个实现真正原型继承的操作符。这是我工具包中的一个标准特性,我强烈推荐给您。 函数对象(O){函数F() {} F.prototype = o;返回新的F();} object函数解开JavaScript的构造器模式,实现真正的原型继承。它以旧对象作为参数,并返回继承自旧对象的空新对象。如果我们试图从新对象中获取一个成员,而它缺少该键,则旧对象将提供该成员。对象继承自对象。还有什么比这更面向对象的呢? 因此,您不必创建类,而是创建原型对象,然后使用object函数创建新实例。对象在JavaScript中是可变的,因此我们可以扩展新实例,为它们提供新的字段和方法。然后,它们可以作为更新的对象的原型。我们不需要类来创建许多类似的对象。 为了方便起见,我们可以创建将为我们调用对象函数的函数,并提供其他自定义,例如使用特权函数增强新对象。我有时将这些函数称为maker函数。如果我们有一个maker函数来调用另一个maker函数,而不是调用对象函数,那么我们就有一个寄生继承模式。 我发现,通过使用这些工具,再加上JavaScript的lambdas和对象准文字,我可以编写大型、复杂和高效的结构良好的程序。经典的对象模型是当今最流行的,但我认为原型对象模型更有能力和更有表现力。
发布于 2014-07-08 01:57:27
听起来你只是想把车的原型加进去?还是要将其添加到您创建的所有东西的原型中(不明智)?
car.prototype.logDependencies = function(){ return 'whatever'; }
var lamborghini = new car('red');
lamborghini.logDependencies(); // whatever 下面是如何让一个体面的JavaScript开发人员生气的方法:
Object.prototype.logDependencies = function(){ return "I just don't give a..."; }
var anything = new Object();
anything.logDependencies(); // I just don't give a...为了澄清,在您发布的文章中解释了上述错误的原因:
对象函数的问题在于它是全局的,全局函数显然是有问题的。Object.prototype.someMethod的问题在于它跳过了不称职的程序,当someMethod被覆盖时,它可能会产生意想不到的结果。
读了你的评论后,我觉得你好像想要一根魔杖。也许你来自Java世界?还是一个Actionscript 3世界?其中类型更强,继承是经典的。JavaScript是一种相当灵活的语言,我们都设法将其他语言的各个方面从某种形式中挤出出来。但是,如果您要求JavaScript执行某种基于类的继承系统,而不调用几个方法并到处声明几个变量,那么您就会感到失望。
我建议您阅读Douglas的文章,其中他解释了JavaScript系统的有用性,并暗示了如何利用类似于传统特性的特性。
发布于 2014-07-08 02:04:31
如果您想要类似于继承的东西,car具有parent已经原型化的所有函数,那么您可以使用:
car.prototype = Object.create(parent.prototype);基本上,Object.create(obj)返回一个新对象,其原型设置为obj。car的所有实例都将它们的原型设置为car.prototype。因此,他们可以通过原型链访问parent的功能。
发布于 2014-07-08 04:12:18
您可以始终使用混合器来共享功能。例如:
var mixinLogger = (function () {
return function (that) {
that.logDependencies = logDependencies;
return that;
};
function logDependencies() {
for (var key in this)
if (this.hasOwnProperty(key) &&
this[key] instanceof Dependency)
console.log("Dependency: " + key);
}
}());您使用它的方式如下:
function Dependency(data) {
this.data = data;
}
function Car(color) {
this.color = new Dependency(color);
}
mixinLogger(Car.prototype);使用混合器的优点是它们是可组合的。例如,如果您有两个混合器(mixinA和mixinB),那么您可以按如下方式链接它们:
mixinA(mixinB(Something.prototype));您甚至可以创建一个新的混合器,它是两者的组合:
function compose() {
var fs = arguments;
var length = fs.length;
return function (x) {
var index = length;
while (index > 0) x = fs[--index](x);
return x;
};
}
var mixinC = compose(mixinA, mixinB);事实上,您可以编写任意数量的混合器,以创建新的混合器。
如果您想了解更多,那么您应该阅读博客文章"重新审视JavaScript Mixins“。
https://stackoverflow.com/questions/24622383
复制相似问题