"Javascript - The Good Parts"的示例

7
以下内容解决了什么“丑陋”问题?有些地方我不太明白,希望能得到帮助理解。
例如,通过增强Function.prototype,我们可以使一个方法对所有函数都可用:
Function.prototype.method = function (name, func) {
     this.prototype[name] = func;
     return this; 
};

通过将 Function.prototype 增加一个方法 method,我们不再需要输入原型属性的名称。这个丑陋的部分现在可以隐藏起来了。
1个回答

15

好的,丑陋是主观的,但我们来看看。

通常你会写:

function Foo () {}
Foo.prototype.method1 = function ()  { /*...*/ };
Foo.prototype.method2 = function ()  { /*...*/ };

你可以通过扩展prototype对象来创建一个构造函数,并将想要继承到由new运算符创建的实例中的属性添加到该对象中。

例如,使用var obj = new Foo();创建一个Foo构造函数的实例,该对象将继承绑定到Foo.prototype对象和其他在原型链中更高的对象上的所有属性。

Crockford的方法也是这样做的,该方法定义在Function.prototype对象中,所有函数都从该对象继承,因此您可以像这样调用该方法:

function Foo () {}
Foo.method('method1', function () { /*...*/ });
Foo.method('method2', function () { /*...*/ });

它基本上只是从代码中“隐藏”了prototype这个词,Crockford认为这很丑陋...

《JavaScript语言精粹》是一本非常好的书,但我认为它基于Douglas Crockford对语言的个人观点。

我同意他的很多看法,但我也不同意某些方面...


1
在代码阅读时,使用“原型”这个词更加明确和显而易见。谢谢回答 :) - Matrym
2
我同意。在我看来,Crockford 在这种情况下是错的。 - bobince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接