这个JavaScript增强方法是如何工作的?

这个JavaScript增强方法是如何工作的?,javascript,Javascript,与之类似,我遵循Douglas Crockford的JavaScript,好的部分。在第4章中,他谈到了增广类型,我发现这很让人困惑。他编写了以下示例代码: Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; }; Number.method('integer', function ( ) { return Math[this <

与之类似,我遵循Douglas Crockford的JavaScript,好的部分。在第4章中,他谈到了增广类型,我发现这很让人困惑。他编写了以下示例代码:

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

Number.method('integer', function (  ) {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
});
我不明白这个的语法。prototype[name]特别是括号或数学[this<0?'天花板]:'floor']这又是括号,还有数学的来源。更重要的是,有人能解释一下代码通常是如何工作的,以及测试代码为什么工作的吗?

通过扩展Function.prototype,您可以为每个函数添加一个可用的方法。请记住,JavaScript中的函数是对象,因此它们可以具有属性和方法,例如call或apply

方法函数方法允许您将方法添加到任何给定函数的原型中。数字是一个函数;数字的构造器,它有一个原型。添加到原型中的函数可用于对象的所有实例,在本例中为数字

Math是JavaScript中的内置对象,通过使用括号表示法,可以动态访问对象的属性。请记住,对象键只是字符串,即使您不将它们写为字符串,也可以使用带字符串的括号表示法访问它们,例如:

var obj = {
  key: 'hello'
};

var k = 'key';

obj[k]; //=> 'hello'
就数学而言,它只是根据一个条件决定是否应该使用天花板而不是天花板或地板,你可以这样写:

if (this < 0) {
  Math.ceil(this);
} else {
  Math.floor(this);
}
通过扩展Function.prototype,可以为每个函数添加一个可用的方法。请记住,JavaScript中的函数是对象,因此它们可以具有属性和方法,例如call或apply

方法函数方法允许您将方法添加到任何给定函数的原型中。数字是一个函数;数字的构造器,它有一个原型。添加到原型中的函数可用于对象的所有实例,在本例中为数字

Math是JavaScript中的内置对象,通过使用括号表示法,可以动态访问对象的属性。请记住,对象键只是字符串,即使您不将它们写为字符串,也可以使用带字符串的括号表示法访问它们,例如:

var obj = {
  key: 'hello'
};

var k = 'key';

obj[k]; //=> 'hello'
就数学而言,它只是根据一个条件决定是否应该使用天花板而不是天花板或地板,你可以这样写:

if (this < 0) {
  Math.ceil(this);
} else {
  Math.floor(this);
}
Javascript很奇怪

在大多数语言中,foo=someObject.someMember和JS也允许这样做

但它也可以让你做foo=someObject[someMember],这看起来很愚蠢。。。直到您意识到字符串可以替换为变量

var memberName="someMember"
foo = someObject[memberName]
现在,您可以编写非常动态的代码来利用对象成员,而无需在编写代码时知道这些成员的名称。这就是你发布的代码所做的。刚开始感觉很脏,但这种感觉会过去

Javascript很奇怪

在大多数语言中,foo=someObject.someMember和JS也允许这样做

但它也可以让你做foo=someObject[someMember],这看起来很愚蠢。。。直到您意识到字符串可以替换为变量

var memberName="someMember"
foo = someObject[memberName]
现在,您可以编写非常动态的代码来利用对象成员,而无需在编写代码时知道这些成员的名称。这就是你发布的代码所做的。刚开始感觉很脏,但这种感觉会过去

obj.foo;obj[foo];var foo=foo;obj[foo];都给出了相同的结果;obj[foo];var foo=foo;obj[foo];所有的结果都是一样的