在JavaScript中隐式添加构造函数原型的方法

时间:2015-01-26 20:52:27

标签: javascript

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

Function.prototype.method = function (name, func) {
  this.prototype[name] = func;
  return this;
};

Crockford继续解释

  

"通过使用方法方法扩充Function.prototype,我们不再   必须输入prototype属性的名称。那点丑陋   现在可以隐藏了。"

我基本上不知道这一点。在我们现在不再需要做什么之前我们必须做什么?

3 个答案:

答案 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构造函数 添加新方法时,它都会让您免于一次又一次地写Myfunction.prototype

所以它证明了 crockford的陈述。