隐式地将方法添加到构造函数';JavaScript中的原型

隐式地将方法添加到构造函数';JavaScript中的原型,javascript,Javascript,以下是Crockford的JavaScript代码片段:好的部分: 克罗克福德继续解释这一点 “通过使用方法扩充Function.prototype,我们不再 必须键入原型属性的名称。有点难看 现在可以隐藏了。” 我基本上无法理解这一点。我们以前必须做什么,现在不必再做了?他说的不是写作: MyType.prototype.myMethod = function() { .. }; 你可以这样写: MyType.method("myMethod", function() { .

以下是Crockford的JavaScript代码片段:好的部分:

克罗克福德继续解释这一点

“通过使用方法扩充Function.prototype,我们不再 必须键入原型属性的名称。有点难看 现在可以隐藏了。”


我基本上无法理解这一点。我们以前必须做什么,现在不必再做了?

他说的不是写作:

MyType.prototype.myMethod = function() {
    ..
};
你可以这样写:

MyType.method("myMethod", function() {
    ...
});
有可能(给定
返回此
)点链接另一个调用:

MyType.method("method1", function() {
    ...
}).method("method2", function() {
    ...
});
Meh.

代码分解:

Function.prototype.method
JavaScript中的每个对象都允许原型。这是一种继承方式。函数是创建所有其他函数的
主对象
。在其上设置原型时,所有函数对象都继承该属性。在这种情况下,函数
方法

 Function.prototype.method= function (name, func) {
     this.prototype[name] = func;
     return this;
 };
如果要使用其他方法展开自己的
函数
,则需要键入:

  somefunction.prototype.name = function(){}
使用此方法,您可以执行以下操作:

  somefunction.method(name, function)
这个时髦的小玩意是这样做的:

  this.prototype[name] = func;
它是指使用
this
关键字的函数对象。程序将继续进行原型的继承。使用
[name]
将函数设置为原型。这会将字符串名称转换为属性。为什么会这样?因为:

 this.prototype.name 
不会正常工作。如果您使用上述代码,每次添加新的
方法
时,该方法将被
名称
引用,而不是您选择的名称

为什么
prototype[example]
与prototype.example相同。因为在JavaScript中,每个属性都存储在对象上的ArraySih列表中,并且可以像使用object[]从数组中调用项一样进行调用。

让我们来证明corckford的说法:

“通过使用方法扩充Function.prototype,我们没有 Longer必须键入prototype属性的名称 丑陋现在可以隐藏了。”

这里crockford想说的是,您可以操纵函数。prototype来实现许多不同的功能供您个人使用。它是添加到函数中的一种功能。prototype可以向任何函数添加新方法/属性。javascript中的函数继承了Function.prototype.lets的形式

Function.prototype.method=函数(名称,func){

在这一行中,Function.prototype添加了一个新方法。此方法接收两个参数。
name
satands表示新方法名称。
func
表示其功能。我想您熟悉什么是方法和属性。函数是javascript中的第一类对象。因此可以添加新属性和方法在运行时使用ds

this.prototype[name]=func

这里这个是指调用它的函数。
[name]
是方法名,
func
是方法的功能,它向传递的函数添加一个新方法,然后使用

归还这个

通过此语句,传递的函数将返回一个新方法

这里我有一个实用的例子:

这里的
myfunction
是一个构造函数。我们可以使用
myfunction.prototype.mymethod=function(){..}

如果您将myfunction用作构造函数,这就是您向其添加方法的方式。但是,当您向Function.prototype添加了一个新功能时,您可以像这样简单地调用它

Myfunction.method('mymethod',function (){console.log('i am available'}); //it will add a method named mymethod to Myfunction's prototype 
此语句将向
Myfunction()的原型添加一个名为
mymethod
的新方法

因此,您不必编写
Myfunction.prototype.mymethod=function(){console.log('i available');
。相反,您可以编写
Myfunction.method('mymethod',function(){console.log('i available');

因此,它证明了每当您想向Myfunction构造函数添加新方法时,它将使您不再编写
Myfunction.prototype


因此,这证明了crockford的说法。

触摸你不拥有的东西的原型是一个可怕的想法(你打开了各种冲突的大门)。这是crockford方面令人震惊的不明智的懒惰。“改进”在那里制作并没有太大的实际意义;我认为它更像是一个教学例子。@ssube:Crockford“不明智”?嗯。如果这是个问题,告诉我们,而不是告诉我们…@dandavis,如果每个人都要触摸她没有实现的对象的
原型
,因为你可以在代码中的任何地方这样做,其他人很可能不会意识到这种编辑。比如在第742行,有人写了
String.prototype.toLowerCase=String.prototype.toUpperCase;
迟早会发生一些奇怪的事情,调试它的黑客不会怀疑错误来自于对
String.prototype.toLowerCase
的不同行为的期望。当然,只要我的2美分。不修改本机对象的原型被认为是最佳做法,因为它可能会产生命名冲突将来如果添加了同名的新方法或属性
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};

function Myfunction(){       // a constructor function called Myfunction
    this.name='robin';      // it has a name property
}

Myfunction.method('mymethod',function (){ console.log(' i am available')});  //adds a method named 'mymethod to Myfunction constructor

var newObj=new Myfunction();     // creates a new instance  of Myfunction class
console.log(newObj.mymethod());  //calls mymethod() of newObj
Myfunction.method('mymethod',function (){console.log('i am available'}); //it will add a method named mymethod to Myfunction's prototype