刚读完“JavaScript:The Good Parts” - 好书。但我对第33-34页上的一个非常重要的主题感到困惑 - 增加类型。它描述了添加到Function.prototype的新方法的创建,因此当使用新方法调用时,所有函数都将具有该方法。很公平。但随后的示例显示了此方法正在使用Numbers和Strings。我想,这是对象 - 而不是功能。我在这里缺少什么?
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
用法示例:
Number.method('integer', function() {
return Math[this < 0 ? 'ceiling' : 'floor'](this);
});
document.writeln((-10 / 3).integer()); //-3
答案 0 :(得分:12)
功能对象与功能实例对象
首先,在javascript中,函数也是一个对象。从这里,我的意思不是new()构造创建的对象,而是函数本身。为了避免混淆,我将这些对象称为 Function object ,并将使用new()构造函数创建的对象称为 Function instance object 。
_ proto _和原型属性
javascript中的任何函数对象都有两个属性: _ proto _ 和 prototype 。此外,任何 Function实例对象(使用新构造函数创建)都具有属性 _ proto _ 。 _ proto _ 是定义继承的原因。
可以找到一些好的资源http://zeekat.nl/articles/constructors-considered-mildly-confusing.html
如何定义继承?
如果objA和objC通过任意数量的 _ proto _ 连接,则对象objA继承另一个对象objC。因此,如果objA的 _ proto _ 等于objB,并且objB的 _ proto _ 等于objC,则objA继承objB和objC,而objB继承objC。
继承是什么意思?
这意味着任何继承对象都可以使用继承对象的任何属性。
什么是Function.prototype
每个功能对象的 _ proto _ 所引用的对象。这意味着每个 Function对象都可以访问Function.prototype的属性,因为每个 Function对象都继承了Function.prototype对象。这也意味着如果将方法属性添加到Function.prototype对象,它将可用于javascript中所有可能的 Function对象。这包括字符串,数字等
this.prototype [name] = func; 的
这指的是功能对象当&#39;方法&#39;从函数对象调用,如Number,String等。这意味着我们现在在 Function对象中有一个名为&#34; name&#34;的新属性,它的功能&#39; func&#39;。
功能对象的原型属性有什么用处
功能对象 原型由功能实例对象引用 _ proto _ 使用该函数的新构造创建。
如果执行以下操作:
Number.method(&#39;整数&#39;,function(){...});
然后Number.prototype中定义了整数方法。这意味着每个Number 函数实例对象,例如新号码(2.4),将&#34;继承&#34;这个新属性&#39;整数&#39;来自Number.prototype,因为Number 函数实例对象将其 _ proto _ 设置为Number.prototype。
答案 1 :(得分:10)
您向Number
原型添加了一个方法,因此每个Number 实例都可以访问它。换句话说,因为在Number原型上有一个名为“integer”的属性,所以从任何Number实例访问该属性的任何尝试都将成功。这就是将属性放在构造函数原型上的重点。
当.
运算符的左侧出现JavaScript原始数字时,该语言会自动将其存储在Number实例中,以便方法调用有意义。
编辑 - 让我们看一下“方法”功能的工作原理。在通话中
Number.method( "integer", function() { ... } )
发生了什么事?好吧,在“方法”函数中,“name”参数是“整数”。然后将函数参数指定为this.prototype
的属性。调用“方法”函数时this
是什么?它是Number构造函数。因此,“方法”函数 - 在函数原型上,因此可用于所有函数实例,例如Number构造函数 - 将给定函数添加为所涉及的构造函数原型的属性。
为什么“method”属性作为Number构造函数的属性可见?因为Number构造函数本身就是一个函数。 “method”函数是作为Function原型的一个属性创建的,这意味着它对每个函数实例都是可见的 - 包括Number构造函数。
答案 2 :(得分:0)
Number
或Object
或其他内置类也是构造函数,然后构造函数是JavaScript中的函数。 ECMAScript规范中有两个重要的描述:
每个内置函数和每个内置构造函数都有Function原型对象,它是表达式Function.prototype(15.3.4)的初始值,作为其[[Prototype]]内部属性的值。
除非另有说明,否则每个内置原型对象都有Object原型对象,它是表达式Object.prototype(15.2.4)的初始值,作为其[[Prototype]]内部属性的值,除了对象原型对象本身。
所以在控制台中,我们可以执行代码:
Number.prototype.__proto__.isPrototypeOf(Function)
结果为true
。
这样Number
可以访问Function.prototype
的方法是合理的。
同时,如果我们将Object.prototype
扩展为Object.prototype.say = 'hello';
,我们也可以将say
作为Function.say
访问。
因为Function.prototype.isPrototype(Object)
是true
。
答案 3 :(得分:0)