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