函数代码体与它的原型之间是否有任何关系?

时间:2014-12-13 21:57:38

标签: javascript

当我遇到有关继承的部分时,我一直在经历Javascript Koans。我变得非常着迷,整个上午都在研究如何在JS中继承。

我理解一个函数可以用来执行在其代码体中声明的代码,而一个函数也可以作为该函数原型对象固有的对象的构造函数。

似乎功能有两个完全没有关联的目的 - 创建对象的能力,以及执行它的声明代码的能力 。这两种能力之间有什么关系吗?

2 个答案:

答案 0 :(得分:0)

尝试简单的答案(使用一些近似值来尝试并保持简单)

您可以将“类”函数看作底层对象的构造函数和定义其方法的位置。

建筑

new运算符将创建一个空对象,其类型将引用该函数并将其绑定到this,然后调用该函数。

该函数可以设置this的一些属性,这些属性将成为新实例属性的值。

方法

在JavaScript中,几乎所有东西,特别是函数,都可以拥有属性。 其中,传统命名的prototype属性是所有类方法的容器(可能还有其他属性值)。

function Guy (name) { this.name = name; }
Guy.prototype = {
    sayHello: function () { console.log ("Hello, I'm "+this.name; }
}

Guy方法sayHello实际上是属性Guy.prototype.sayHello,恰好是一个函数。

您也可以向prototype属性添加值而不是函数,这些属性将作为类变量(排序)。

所以让我们从函数/类Bob创建一个对象Guy

var Bob = new Guy("Bob");
Bob.sayHello();

当您调用Bob.sayHello()时,虚拟机将首先查找Bob.sayHello属性(通常不存在),然后查找Guy.prototype.sayHello(并继续查找继承链)或者死去尝试,但这是另一个主题),然后将this绑定到Bob并致电Guy.prototype.sayHello,这将能够通过Bob访问this个实例

作为该机制的一个例子,您可以打破给定对象实例的原型链:

Bob.sayHello = function () { console.log ("my real name is Robert"); }

答案 1 :(得分:0)

你所描述的二元性实际上并不存在。存在要执行的功能。但是,在JavaScript中,函数也是对象,因此它们可以具有prototype等属性。 (你可以为你的函数添加其他属性,并从它的身体中使用它们作为使其“有状态”的一种方法。)从函数的角度来看,prototype只是另一个普通的属性。

对象构造是new运算符的域。它的作用是:

  1. 它会创建一个空对象
  2. 它在创建的对象及其构造函数之间创建一个隐藏的,不可修改的绑定,然后只要对象本身不存在属性,就会在其prototype上查找属性值,
  3. 它在该对象的上下文中执行提供的函数 this在该函数执行期间指向它),
  4. 它返回创建的对象(如果提供的函数返回undefined)或提供​​的函数的返回值。
  5. (创建对象的{}表示法只是new Object()的快捷方式。)


    关于原型继承的附加说明(在JavaScript中使用):上述序列中的第二步具有重要结果。 JavaScript中的任何对象都有一个构造函数({}具有Object作为构造函数),因此将对象设置为函数的prototype属性的值不仅仅会创建单个绑定。它传递性地创造了一个“原型链”。然后首先在对象上查找任何属性,然后在其构造函数的原型上查找,然后在构造函数的原型构造函数的原型等上查找。