当我遇到有关继承的部分时,我一直在经历Javascript Koans。我变得非常着迷,整个上午都在研究如何在JS中继承。
我理解一个函数可以用来执行在其代码体中声明的代码,而一个函数也可以作为该函数原型对象固有的对象的构造函数。
似乎功能有两个完全没有关联的目的 - 创建对象的能力,以及执行它的声明代码的能力 。这两种能力之间有什么关系吗?
答案 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
运算符的域。它的作用是:
prototype
上查找属性值, this
在该函数执行期间指向它),undefined
)或提供的函数的返回值。(创建对象的{}
表示法只是new Object()
的快捷方式。)
关于原型继承的附加说明(在JavaScript中使用):上述序列中的第二步具有重要结果。 JavaScript中的任何对象都有一个构造函数({}
具有Object
作为构造函数),因此将对象设置为函数的prototype
属性的值不仅仅会创建单个绑定。它传递性地创造了一个“原型链”。然后首先在对象上查找任何属性,然后在其构造函数的原型上查找,然后在构造函数的原型构造函数的原型等上查找。