在JAVASCRIPT编程过程中,您可以使用名为prototpye的实例变量来指定对象的基础。方法是设置prototype的实际变量使其指向继承链的父对象。如此设置prototype之后,你所创建的对象会为末指定的那些对象继承属性和函数。这样一来,您就可以模仿面向对象的继承概念。
<script type='text/javascript'> var Animal = function() { this.name = "nobody" this.speak = function () { return "Who am I?" } } var Dog = function() { this.speak = function() { return "Woof!" } } Dog.prototype = new Animal(); myAnimal = new Dog(); alert('The animal named ' + myAnimal.name + ' says ' + myAnimal.speak()); </script>
示例中,创建了一个Dog
原型。此原型基于Animal。
Dog
重定义speak()
方法但却不会对name()
方法做任何改动。随后,将原型Dog
设置成Animal
。下图显示了其结果:
这也展示了 JavaScript 是如何解决到属性或方法的引用问题的:
- JavaScript 基于原始的原型创建实例,该原型在构造函数中定义。任何对方法或属性的引用都会使用所生成的原始副本。
- 您可以在对象内像定义其他任何变量一样重新定义这些变量。这样做必然会更改此对象。所以您显式定义的任何属性或函数都将比在原始的原型中定义的那些属性或函数优先级要高。
- 如果您显式设置了名为
prototype
的实例变量,JavaScript 就会在此实例中寻找任何未定义的实例变量或属性。这种查找是递归的:如果 在prototype
内定义的实例不能找到属性或函数,它就会在其 原型中查找,依此类推。
那么,JavaScript 的继承模型到底是什么样的?这取决于您如何对它进行定义。您需要定义继承行为以便可以覆盖它。然而,从本质上讲,JavaScript 更像是一种函数式语言,而非面向对象的语言,它使用一些智能的语法和语义来仿真高度复杂的行为。其对象模型极为灵活、开放和强大,具有全部的反射性。有些 人可能会说它太过灵活。而我的忠告则是,按具体作业的需要选择合适的工具。