JavaScript - 好的部分:函数原型与对象原型

时间:2014-01-24 00:08:40

标签: javascript

刚读完“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

4 个答案:

答案 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)

NumberObject或其他内置类也是构造函数,然后构造函数是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)

这是恶魔,你可以清楚地看到和明显之间的区别 enter image description here

[**

<块引用>

在此处输入图片说明 **]2