Javascript 扩充Function.prototype并使方法可用于所有函数?

Javascript 扩充Function.prototype并使方法可用于所有函数?,javascript,Javascript,今年年初,我开始使用Javascript编写代码。我很难理解Javascript的一些关键概念,尤其是原型继承。 我从Douglas Crockford的书中了解到,如果您增强Function.prototype,您可以使一个方法适用于所有函数。而且,这是一个代码 Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; }; 我测试了书中的以下代码

今年年初,我开始使用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等不同的组合,但我就是无法打印出“这是一个测试”。有人能帮忙吗?

实际上,“string”是string类的一个实例。所以,只要创建一个类的实例,它就可以工作了

function Foo()
{
};

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

console.log(new Foo().test());
trim()是String.prototype的一种方法,已经出现在Javascript的现代版本中,因此不是一个很好的示例。自己跳过额外的步骤和原型功能:

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

function Foo(){
}

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

String
示例中调用方法的方式与
Foo
示例中调用方法的方式不同。在
String
示例中,您在
String
的实例上调用它:

'    neat    '.trim()
而您在类函数中调用它
Foo

Foo.test()
退房。这听起来很奇怪,因为它总是让人困惑,但是原型不是[[prototype]]。当Javascript查找继承的属性时,它会查看对象创建时分配的
[[Prototype]]
。如果要为类的实例设置
[[Prototype]]
,可以在构造函数上设置
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

ECMAScript中没有类。@RobG类是通过函数定义模拟的。“new Foo()”是FooI的一个实例,它试图找出这张图片()中对象之间的关系。在我看来,Function.prototype不在foo(即newfoo())的原型链中。这幅画有错误吗?谢谢@user2629723我相信你怀疑的根源是。。。“Foo.prototype”属于对象“Foo”,但是您的书没有使用Foo.prototype来添加“trim”,而是使用一个名为“method”的函数包装器,在这里,他们为该对象的“当前实例”而不是对象本身创建了一个新的原型方法。“方法”通过使用“this.prototype”而不是“Foo.prototype”来定义实例,我相信您的书使用了这种技术,因为它有助于继承。我不喜欢批评别人的作品,但似乎不是学习JS的最佳书籍。我不确定DC是否是学习JavaScript原型的好来源。他抱怨没有用于封装的私有变量,但通过修改他不拥有的对象(函数、对象、字符串…)完全忽略了封装参考:我看到他声明不能重复使用父构造函数,并创建父构造函数的实例来设置子构造函数的原型。下面的回答解释了构造函数函数、原型及其用途(DC将调用“经典继承”)当前位置在看到以下内容后,我放弃了听Crockford关于“古典遗产”的演讲:(第一条评论指出了它的错误之处),但他在书籍和文章中重复了错误的信息。