增加Function.prototype并使方法可用于所有函数?

时间:2014-09-01 03:14:42

标签: javascript

我今年年初开始使用Javascript编写代码。我很难搞清楚一些Javascript关键概念,特别是原型继承。 我从Douglas Crockford的书中了解到,如果你扩充Function.prototype,你可以为所有函数提供一个方法。并且,有这个代码......

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

我测试了本书中的以下代码,但它确实有效。

String.method('trim',function(){
    return this.replace(/^\s+|\s+$/g, '');
});

console.log('"'+'    neat    '.trim() + '"');

然后,我尝试创建一个自定义函数并为其增加一个方法。

function Foo()
{
};

Foo.method('test', function() {
    return "This is a test!";
});

console.log(Foo.test());

实际上,我尝试过console.log不同的组合Foo,test(), proto 等等,但我无法得到"这是一个测试!&# 34;打印出来。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

实际上"字符串"是String类的一个实例。所以只需创建一个类的实例,它应该可以工作。

function Foo()
{
};

Foo.method('test', function() {
    return "This is a test!";
});

console.log(new Foo().test());

答案 1 :(得分:0)

trim()是现代版本的Javascript中String.prototype的一种方法,所以不是一个很好的例子。自己跳过额外的步骤和原型功能:

Function.prototype.test = function(){
    return "This is a test!";
}

function Foo(){
}

console.log(Foo.test());
// logs "This is a test!"

答案 2 :(得分:0)

您在String示例中调用方法与Foo示例之间的方法存在差异。在String示例中,您在String的实例上调用它:

'    neat    '.trim()

而你在类函数Foo上调用它:

Foo.test()

结帐the explanation of the prototype chain at Mozilla。这听起来很奇怪,因为它总是让人困惑,但原型不是[[Prototype]] 。当Javascript查找继承的属性时,它会查看[[Prototype]],它会在创建对象时分配。如果要为类的实例设置[[Prototype]],请在构造函数Function上设置prototype属性。这就是我的想法:

function Foo() {};
Foo.prototype = {...};
// note:
//   Foo.prototype == {...}
//   Foo.[[Prototype]] == Function.prototype
var foo = new Foo();
// note:
//   foo.prototype is undefined
//   foo.[[Prototype]] == Foo.prototype