【发布时间】:2014-07-08 01:29:48
【问题描述】:
我正在尝试在 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(),而不需要我手动添加它。
我该怎么做?
更新:
对于那些对我的措辞感到困惑的人:
我正在尝试制作一个原型设计函数,它允许我创建继承某些属性和方法的原型,并将它们传递到继承链中。
Douglas Crockford 的相关文章(强调我自己的):
我的旅程很曲折,因为 JavaScript 本身就其原型性质存在冲突。在原型系统中,对象继承自对象。然而,JavaScript 缺少执行该操作的运算符。相反,它有一个新的运算符,这样
new f()会生成一个继承自f.prototype的新对象。这种间接方式旨在让受过经典培训的程序员更熟悉该语言,但未能做到这一点,正如我们从 Java 程序员对 JavaScript 的极低评价中可以看出的那样。 JavaScript 的构造函数模式并不吸引经典人群。它还掩盖了 JavaScript 真正的原型性质。因此,很少有程序员知道如何有效地使用该语言。
幸运的是,创建一个实现真正原型继承的运算符很容易。这是我工具包中的标准功能,我强烈推荐给你。
function object(o) { function F() {} F.prototype = o; return new F(); }对象函数解开了 JavaScript 的构造函数模式,实现了真正的原型继承。它接受一个旧对象作为参数,并返回一个继承自旧对象的空新对象。如果我们尝试从新对象中获取成员,但它缺少该键,则旧对象将提供该成员。对象继承自对象。还有什么比这更面向对象的呢?
所以不是创建类,而是创建原型对象,然后使用对象函数创建新实例。对象在 JavaScript 中是可变的,因此我们可以扩充新实例,为它们提供新的字段和方法。然后这些可以作为更新对象的原型。我们不需要类来制作大量相似的对象。
为方便起见,我们可以创建函数来为我们调用对象函数,并提供其他自定义,例如用特权函数扩充新对象。 我有时将这些创建函数称为。如果我们有一个 maker 函数调用另一个 maker 函数而不是调用 object 函数,那么我们就有一个寄生继承模式。
我发现通过使用这些工具,再加上 JavaScript 的 lambda 和对象准字面量,我可以编写结构良好的大型、复杂和高效的程序。迄今为止,经典对象模型是当今最流行的,但我认为原型对象模型的能力更强,表达能力更强。
【问题讨论】:
-
如果
dependency被用作构造函数,那它为什么会有return语句呢? -
您是说您希望 logDependencies 在全球范围内可用,还是您希望在无需手动调用的情况下调用 logDependencies?
-
我的意思是,如果你把它称为
dependency('red'),return 语句是有意义的,但是如果你把它称为new dependency('red'),那么return 语句是没有意义的,因为new的结果总是返回this。 -
@joshboley 我说我想创建一个原型,从它自己的原型继承方法
logDependencies()。继承某些方法的特殊原型。不,我不希望这些方法是全局的。 -
好的@jt0dd,如果你实现了你的要求,你能举一个你希望顺利工作的代码示例吗?
标签: javascript prototype