我今年年初开始使用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;打印出来。有人可以帮忙吗?
答案 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