以下是 Crockford的JavaScript代码片段:好的部分:
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
Crockford继续解释
"通过使用方法方法扩充Function.prototype,我们不再 必须输入prototype属性的名称。那点丑陋 现在可以隐藏了。"
我基本上不知道这一点。在我们现在不再需要做什么之前我们必须做什么?
答案 0 :(得分:9)
他说的不是写作:
MyType.prototype.myMethod = function() {
..
};
你可以这样写:
MyType.method("myMethod", function() {
...
});
有可能(给定return this
)点链另一个电话:
MyType.method("method1", function() {
...
}).method("method2", function() {
...
});
咩。
答案 1 :(得分:2)
代码分解:
Function.prototype.method
JavaScript中的每个对象都允许原型。它是JavaScript的继承方式。函数是master object
,从中创建所有其他函数。在其上设置原型时,所有Function对象都继承该属性。在这种情况下,函数method
。
Function.prototype.method= function (name, func) {
this.prototype[name] = func;
return this;
};
如果您希望使用其他方法展开自己的functions
,则需要输入:
somefunction.prototype.name = function(){}
使用此方法,您可以这样做:
somefunction.method(name, function)
这个时髦的一点就是这样:
this.prototype[name] = func;
它使用this
关键字引用Function对象。继承原型的收益。使用[name]
将函数设置为原型。这会将字符串名称转换为属性。为什么这样?这是因为:
this.prototype.name
不能正常工作。如果您使用上述代码,则每次添加新method
时,name
都会引用该代码而不是您选择的名称。
为什么prototype[example]
与prototype.example相同。因为在JavaScript中,每个属性都存储在对象的数组列表中,并且可以像使用Object []从数组中调用项目一样进行调用。
答案 2 :(得分:1)
让我们证明corckford的陈述:
“通过使用方法方法扩充Function.prototype,我们没有 longhave来键入prototype属性的名称。那一点 现在可以隐藏丑陋。“
这里crockford想说你可以操纵 Function.prototype 来为你的个人用途实现许多不同的功能。它是添加到function.prototype中的一个功能来添加任何函数的新方法/属性.javascript中的函数继承形式Function.prototype.lets分解你的代码。
Function.prototype.method = function(name,func){
在这一行中为Function.prototype添加了一个新方法。这个方法接收两个参数。name
satands表示新方法名称。func
代表它的功能。我认为你熟悉什么是方法和属性。函数是javascript中的第一类对象。所以它们可以在运行时添加新的属性和方法。
this.prototype [name] = func;
此处 此 指的是调用它的函数。[name]
是方法名称,func
是方法的功能它添加了一个新方法使用array notation. 传递函数 然后最后
返回此内容;
使用此语句返回 传递函数 并添加新方法。
我在这里有一个实际的例子:
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
是一个构造函数。我们可以将继承的方法添加到此构造函数的原型usind 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
此语句将向mymethod
隐式 添加名为Myfunction()'s prototype
的新方法。
所以 不 必须写Myfunction.prototype.mymethod=function(){ console.log('i am available');
。相反,您可以写Myfunction.method('mymethod',function (){ console.log('i am available'});
因此,每当您想要向Myfunction.prototype
。
所以它证明了 crockford的陈述。